Rearranging list based on order of another list

Question:

I am sure this question has possibly been asked before but I can’t seem to find the correct answer. If I have two lists

_list1 = ["keyName", "test1", "test2"]
_list2 = ["keyName", "test2", "test1"]

I am trying to use _list1 to rearrange elements in _list2 so that they match the order exactly. What’s the cleanest way to do that? Desired output:

_list1 = ["keyName", "test1", "test2"]
_list2 = ["keyName", "test1", "test2"]

I am sorry if this is duplicate but so far I am only able to find answers for list of numbers and using zipped sorted() method.

What if the _list2 is a list of lists?

_list2 = [["test1", "test2", "keyName"], ["test2", "test1", "keyName"]]

Desired Output:

_list2 = [["keyName", "test1", "test2"], ["keyName", "test1", "test2"]]

One more what if: What if I wanted to sort any other list of objects using _list1 as a key

_list2 = [[object1, object2, object3], [object1, object2, object3]]

where:

object1.Name = "keyName"
object3.Name = "test1"
object2.Name = "test2"

so effectively I would expect output of:

_list2 = [[object1, object3, objec1], [object1, object3, objec1]]

Is that possible?

Asked By: konrad

||

Answers:

try to use key with sorted:

sorted(_list2,key=_list1.index)

for nested list you can use list comphresnion:

[sorted(x,key=_lis1.index) for x in _list2]
Answered By: Hackaholic
In [84]: _list1 = ["keyName", "test1", "test2"]

In [85]: d = {k:v for v,k in enumerate(_list1)}

In [86]: _list2 = ["keyName", "test2", "test1"]

In [87]: _list2.sort(key=d.get)

In [88]: _list2
Out[88]: ['keyName', 'test1', 'test2']
Answered By: inspectorG4dget

Both previous answers do work when the list used for sorting does contain the same key values. If this is not the case this function could help:
It will add all missing values to the end of the sorted list.

def sort_list(order, list_to_order):
    i=len(order) 
    sorted_list= [None] * (len(list_to_order)+(len(order)))
    for value in list_to_order:
       try: 
           idx = order.index(value)
           sorted_list[idx]= value
       except ValueError: #value not found in the list
           sorted_list[i]= value
           i=i+1
    return [x for x in sorted_list if x!=None]
Answered By: Janinger
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.