2014-12-31 3 views
3

Я уверен, что этот вопрос, возможно, задан раньше, но я не могу найти правильный ответ. Если у меня есть два спискапереупорядочивающий список по заказу другого списка в python

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

Я пытаюсь использовать _list1 переставить элементы в _list2 так, чтобы они соответствовали заказ точно. Какой самый чистый способ сделать это? Желаемый результат:

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

Я сожалею, если это дубликат, но до сих пор я только смог найти ответы на список номеров и с помощью метода архивных сортировок(). Благодаря!

Что делать, если _list2 - это список списков?

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

Желаемая Выход:

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

Еще одно, что если: Что, если я хочу, чтобы отсортировать любой другой список объектов, использующих _list1 в качестве ключевого

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

где:

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

так эффективно я бы ожидал outpu т:

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

- это возможно?

+0

Are оба списка будет иметь тот же значение, точно? –

+1

Возможный дубликат [Как вы сортируете список в python, сравнивая его с отдельным списком?] (Http://stackoverflow.com/questions/27573420/how-do-you-sort-a-list-in-python -by-comparing-it-to-a-list-list) – CoryKramer

+0

Да, все они будут иметь одинаковые строковые значения. Еще одно предупреждение, возможно, что _list2 будет вложенным списком списков, который будет содержать списки тех же строковых значений, что и _list2 = [["test1", "keyName", "test2"] ["test2", "test1" , "keyName"]]. Таким образом, значения всегда будут одинаковыми с тем, что иногда структура _list2 может измениться. – konrad

ответ

3
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'] 
+0

с использованием dict это будет быстрее, так как get имеет O (1), где индекс имеет O (n). ХОРОШО :) – Hackaholic

6

пытается использовать ключ с отсортированным:

sorted(_list2,key=_list1.index) 

для вложенного списка, вы можете использовать список comphresnion:

[sorted(x,key=_lis1.index) for x in _list2] 
+0

можете ли вы взглянуть на комментарий выше? что, если _list2 является вложенным списком списков .... есть ли способ отсортировать каждый подсписчик? – konrad

+0

@konrad Update ur post с правильным вводом и ожидаемым выходом – Hackaholic

Смежные вопросы