Skip to content Skip to sidebar Skip to footer

How To Sort One List Based On Another?

I have two list, one reference and one input list Ref = [3, 2, 1, 12, 11, 10, 9, 8, 7, 6, 5, 4] Input = [9, 5, 2, 3, 10, 4, 11, 8] I want to sort Input list, in the order as that

Solution 1:

I think this answers your question:

>>> [x for x in Ref if x in Input]
>>> [3, 2, 11, 10, 9, 8, 5, 4]

Hope it helps.

UPDATE: Making Input a set for faster access:

>>> Input_Set = set(Input)
>>> [x for x in Ref if x in Input_Set]
[3, 2, 11, 10, 9, 8, 5, 4]

Solution 2:

Another approach in addition to dcg's answer would be as follows:

Ref = [3, 2, 1, 12, 11, 10, 9, 8, 7, 6, 5, 4]
Input = [9, 5, 2, 3, 10, 4, 11, 8]

ref = set(Ref)
inp = set(Input)

sorted_list = sorted(ref.intersection(inp), key = Ref.index)

This outputs to:

[3, 2, 11, 10, 9, 8, 5, 4]

Here you convert the lists into sets, find their intersection, and sort them. The set is sorted based on the 'Ref' list's indexing.


Solution 3:

You can use the sorted method:

# keep in a dict the index for each value from Ref
ref  = {val: i for i, val in enumerate(Ref)}
# sort by the index value from Ref for each number from Input 
sorted(Input, key=ref.get)

output:

[3, 2, 11, 10, 9, 8, 5, 4]

Solution 4:

Here's the naive approach:

sorted(Input, key=Ref.index)

Or in-place:

Input.sort(key=Ref.index)

Either way it's just one line.

Although I think it's slow -- O(n*m) where n and m are the lengths of Input and Ref. @rusu_ro1's solution uses a similar method but seems to be O(n+m).


Post a Comment for "How To Sort One List Based On Another?"