Сортировка списков кортежей на основе списка кортежей - Python - PullRequest
3 голосов
/ 16 апреля 2011

Я пытаюсь отсортировать список кортежей на основе другого списка кортежей по ключу в этом списке.

Скажите, у меня есть следующее:

list1 = [(5, 'something'),(2,'bobby'),(9,'suzy'),(6,'crab')]
list2 = [('something','othervalues'),('suzy','stuff'),('bobby','otherthings')]

И из этого я получу вывод сортировки по первому элементу каждого кортежа в list1.

sorted = [('suzy','stuff'),('something','othervalues'),('bobby','otherthings') ]

Таким образом, он выполняет пересечение, а затем сортирует оставшиеся значения по первому элементу в кортеже list1.

Я не уверен, как это сделать, поэтому любая помощь будет отличной.

Ответы [ 3 ]

3 голосов
/ 16 апреля 2011

Просто сделайте то, что написано в описании, отсортируйте список кортежей на основе другого списка кортежей по ключу в этом списке:

rank = {key:rank for rank, key in list1}
print(sorted(list2, key=lambda t: rank.get(t[0]), reverse=True))
3 голосов
/ 16 апреля 2011

Сначала создайте словарь из list1:

>>> order = dict(reversed(t) for t in list1)

Это создает отображение name -> number.

Затем вы можете использовать метод sorted (не называйте свойпеременная таким образом) и выражение lambda как key:

>>> sorted(list2, key=lambda x: order[x[0]], reverse=True)
[('suzy', 'stuff'), ('something', 'othervalues'), ('bobby', 'otherthings')]

или, если вы хотите отсортировать на месте:

>>> list2.sort(key=lambda x: order[x[0]], reverse=True)

Стоит прочитать: Сортировка мини-КАК

0 голосов
/ 16 апреля 2011

Это было бы легко, если бы list2 a dict, вот так:

{'bobby': 'otherthings', 'something': 'othervalues', 'suzy': 'stuff'}

Python сделает преобразование за вас:

>>> dict2 = dict(list2)

Затем вы можете использовать list comprehension:

>>> [(k,dict2[k]) for _,k in sorted(list1, reverse=True) if k in dict2]
[('suzy', 'stuff'), ('something', 'othervalues'), ('bobby', 'otherthings')]

NB: sorted - встроенную функцию Python иплохой выбор для имени переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...