Сортировка списка списков по третьему списку указанного несортированного порядка - PullRequest
4 голосов
/ 03 апреля 2012

У меня есть список:

[['18411971', 'kinase_2', 36], ['75910712', 'unnamed...', 160], ...
  • около 60 записей
  • каждая запись представляет собой список с тремя значениями

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

Ответы [ 3 ]

3 голосов
/ 03 апреля 2012

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

>>> a = [[1,2],[2,10,10],[3,4,'fred']]
>>> b = [2,1,3]
>>> sorted(a,key=lambda x: b.index(x[0]))
[[2, 10, 10], [1, 2], [3, 4, 'fred']]

Это может привести к проблемам с производительностью, хотя - если ключи являются хэшируемыми, это, вероятно, будет быстрее для длинных списков:

>>> order_dict = dict(zip(b, range(len(b))))
>>> sorted(a,key=lambda x: order_dict[x[0]])
[[2, 10, 10], [1, 2], [3, 4, 'fred']]
2 голосов
/ 03 апреля 2012

Как насчет:

inputlist = [['18411971', 'kinase_2', 36], ['75910712', 'unnamed...', 160], ... # obviously not valid syntax
auxinput = aux = ['75910712', '18411971', ...] # ditto
keyed = { sublist[0]:sublist for sublist in inputlist }
result = [keyed[item] for item in auxinput]

Нет необходимости использовать сортировку здесь. Для больших списков это будет быстрее, потому что это O(n), а не O(n * log n).

В случае, если ключи не являются уникальными, можно использовать какой-либо вариант упорядоченного диктанта (например, defaultdict(list) согласно предложению Niklas B.) для построения представления с ключами.

0 голосов
/ 03 апреля 2012

Итак, если я вас правильно понял, у вас есть пример списка ввода:

a = [['18411971', 'kinase_2', 36], ['75910712', 'unnamed...', 160], ...

, и вы хотите отсортировать его, используя дополнительный список, в котором упоминается порядок, в котором первые элементы субэлементасписки должны появляться в выходных данных:

aux = ['75910712', '18411971', ...]

Если все верно, я думаю, что результат может быть достигнут с помощью чего-то вроде:

sorted(a, key = lambda x: aux.index(x[0]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...