Вопрос по list, dictionary, python, sorting, key – Как отсортировать внешний и внутренний подсписок вложенного списка в Python?

2

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

data =  [[1, .45, 0], [2, .49, 2], [3, .98, 0], [4, .82, 1], [5, .77, 1], [6, .98, 2] ]

Я делаю это с помощью:sorted(data,key=operator.itemgetter(2),reverse = True), который дает мне:

[[1, .45, 0], [3, .98, 0],[4, .82, 1], [5, .77, 1], [2, .49, 2], [6, .98, 2]]

Теперь я хотел бы отсортировать в подсписках, то есть сначала отсортировать список с его последним членом как «0». используя средний элемент в качестве ключа, в порядке убывания. Затем сортируйте подсписок с помощью «1». как его последний член и так далее. Обратите внимание, что количество элементов в каждом подсписке различно и не известно. Окончательный список должен выглядеть так:

[[3, .98, 0],[1, .45, 0], [4, .82, 1], [5, .77, 1], [6, .98, 2],[2, .49, 2] ]

Список на самом деле довольно большой, поэтому я ищу эффективную реализацию. Любое руководство будет оценено!

Извиняюсь, я допустил ошибку при наборе текста. Это должно было быть наоборот = Ложь. R.Bahl
Я думаю, что ваш второй пример задом наперед ... вы отсортировали обратное право? jdi
Просто чтобы немного углубиться в это (поскольку ответ уже был предоставлен), что именно вы пытаетесь сделать перед этим шагом? Там может быть лучший способ достижения вашей цели, а не беспокоиться о внутреннем компоненте сортировки. Например, если вы читаете эти данные откуда-то, возможно, имеет смысл отсортировать их при загрузке. Также возможно использование генераторов, а не списков / диктов. Это может помочь, если вы разместите другой вопрос с вопросом "есть ли лучший способ достичь X"? Просто мысль :) Josh Smeaton
@ R.Bahl, вы можете захотеть взглянуть на пакет itertools - он может иметь некоторые функции, которые могут быть вам полезны. Например, эффективно генерировать парные комбинации. Там, где вы изначально получаете данные, также должно быть место для оптимизации. Проблема кажется мне очень абстрактной без дополнительного контекста. Но да, как я и предположил, возможно, другой вопрос может дать какое-то хорошее решение. Удачи. Josh Smeaton
@JoshSmeaton: Большое спасибо за ваше предложение! Я генерирую эти списки, которые формируют значения в словаре с помощью вычислений, которые можно представить как для значений в некотором множестве (A), для значений b в некотором множестве (B), возвращающих значения + bvalues, т.е., скажем, возвращающих сумму всех попарные комбинации в обоих наборах. Ключи будут значениями в setA, а список будет его [соответствующей суммой будут все элементы в паре с соответствующим элементом setB]. Я также постараюсь составить отдельный вопрос, но любая обратная связь высоко ценится! R.Bahl

Ваш Ответ

2   ответа
1

data =  [[1, .45, 0], [2, .49, 2], [3, .98, 0], [4, .82, 1], [5, .77, 1], [6, .98, 2] ]
sorted(data, key=lambda x: (x[2], -x[1]))

[[3, 0.98, 0],
 [1, 0.45, 0],
 [4, 0.82, 1],
 [5, 0.77, 1],
 [6, 0.98, 2],
 [2, 0.49, 2]]
3
>>> data =  [[1, .45, 0], [2, .49, 2], [3, .98, 0], [4, .82, 1], [5, .77, 1], [6, .98, 2] ]
>>> sorted(data, key=lambda x:(x[2], -x[1]))
[[3, 0.98, 0], [1, 0.45, 0], [4, 0.82, 1], [5, 0.77, 1], [6, 0.98, 2], [2, 0.49, 2]]

ти

Спасибо !! Это работает отлично. Просто в продолжение моего предыдущего комментария о том, что список огромен, для начала я храню их в словаре как пары ключ: значение, где значения - это списки, а ключи - некоторые числа. Поскольку число ключей и размер списка исчисляются тысячами, быстро становится невозможным найти их из оперативной памяти. Какой должен быть наиболее оптимизированный способ сделать это? Я не решаюсь хранить эти огромные словари в памяти, пока сортирую список, связанный с каждым ключом. R.Bahl
@ R.Bahl: сортировать каждый на месте с помощью:aList.sort(...) ? Тогда вы не генерируете чрезмерно дублированную память.
@jdi: я согласен с тобой. Но, поскольку количество ключей велико (& gt; 10 000), и каждый список, соответствующий значению ключа, может содержать & gt; 20 000 небольших внутренних списков (которые мы только что отсортировали), то делает это в памяти хорошим способом приблизиться Это ? R.Bahl
Гах. Вы ввели это 6 минут назад, и оно уведомило меня, когда я отправлял это (задержка). Почти слово в слово
@ R.Bahl, если у вас достаточно оперативной памяти, делать сортировку в памяти предпочтительнее. Звучит так, как будто вам понадобится довольно много оперативной памяти, чтобы сделать это, но, возможно, это возможно с 16 ГБ или около того

Похожие вопросы