Как отсортировать внешний и внутренний подсписок вложенного списка в Python?

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

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] ]

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

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

Ответы на вопрос(2)

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]]
Решение Вопроса
>>> 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.Bahl27 июн. 2012 г., 07:48
@jdi: я согласен с тобой. Но, поскольку количество ключей велико (& gt; 10 000), и каждый список, соответствующий значению ключа, может содержать & gt; 20 000 небольших внутренних списков (которые мы только что отсортировали), то делает это в памяти хорошим способом приблизиться Это ?
 27 июн. 2012 г., 07:36
Гах. Вы ввели это 6 минут назад, и оно уведомило меня, когда я отправлял это (задержка). Почти слово в слово
 27 июн. 2012 г., 07:40
@ R.Bahl: сортировать каждый на месте с помощью:aList.sort(...) ? Тогда вы не генерируете чрезмерно дублированную память.
 R.Bahl27 июн. 2012 г., 07:38
Спасибо !! Это работает отлично. Просто в продолжение моего предыдущего комментария о том, что список огромен, для начала я храню их в словаре как пары ключ: значение, где значения - это списки, а ключи - некоторые числа. Поскольку число ключей и размер списка исчисляются тысячами, быстро становится невозможным найти их из оперативной памяти. Какой должен быть наиболее оптимизированный способ сделать это? Я не решаюсь хранить эти огромные словари в памяти, пока сортирую список, связанный с каждым ключом.
 27 июн. 2012 г., 09:05
@ R.Bahl, если у вас достаточно оперативной памяти, делать сортировку в памяти предпочтительнее. Звучит так, как будто вам понадобится довольно много оперативной памяти, чтобы сделать это, но, возможно, это возможно с 16 ГБ или около того

Ваш ответ на вопрос