Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rearranging list based on order of another list

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?

like image 918
konrad Avatar asked Dec 31 '14 19:12

konrad


People also ask

How do you rearrange the order of a list in Python?

You can sort a list in Python using the sort() method. The method accepts two optional arguments: reverse : which sorts the list in the reverse order (descending) if True or in the regular order (ascending) if False (which it is by default)

Can you sort a nested list?

There will be three distinct ways to sort the nested lists. The first is to use Bubble Sort, the second is to use the sort() method, and the third is to use the sorted() method.


2 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]
like image 167
Hackaholic Avatar answered Sep 17 '22 18:09

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']
like image 41
inspectorG4dget Avatar answered Sep 18 '22 18:09

inspectorG4dget