2012-04-18 5 views
0

У меня есть вложенный список:

Сортировка вложенного списка в Python

a = [[{'aa': 2L}, {}, {'mm': 9L}, {}, {}], [{'aa': 1L}, {}, {'mm': 5L}, {}, {}], [{'aa': 2L}, {}, {'mm': 7L}, {}, {}], [{'aa': 5L}, {}, {'mm': 7L}, {}, {}]] 

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

a = [[{'aa': 1L}, {}, {'mm': 5L}, {}, {}], [{'aa': 2L}, {}, {'mm': 7L}, {}, {}], [{'aa': 5L}, {}, {'mm': 7L}, {}, {}], [{'aa': 2L}, {}, {'mm': 9L}, {}, {}]] 

выход я получаю от a.sort():

a = [[{'aa': 1L}, {}, {'mm': 5L}, {}, {}], [{'aa': 2L}, {}, {'mm': 7L}, {}, {}], [{'aa': 2L}, {}, {'mm': 9L}, {}, {}], [{'aa': 5L}, {}, {'mm': 7L}, {}, {}]] 

N от желаемого.

Здесь я хочу отсортировать список 'a', рассмотрев любой из ключей дочерних списков. В этом случае я использую третий словарь и ключ 'mm'.Right теперь есть только один ключ' mm 'there может быть несколько пар значений ключа, но я должен уметь избегать других и выполнять сортировку только по значению «мм».

+1

Насколько я вижу, как желаемое и 'a.sort()' выход одинаковы (за исключением некоторых недостающих пробелов в желаемом выходе!) – hjpotter92

+0

Непонятно, что вы хотите отсортировать здесь. Я дал общий совет, для чего-то более адаптированного к вашей ситуации, немного изменил и разъяснил. –

ответ

2

Я не уверен, правильно ли получил вопрос, но ответ кажется простым для меня, как показано ниже.

Index третий элемент [3] в ключе, а затем повторно индексировать словарь с ключом mm

>>> sorted(a,key=lambda key:key[2]['mm']) 
[[{'aa': 1L}, {}, {'mm': 5L}, {}, {}], [{'aa': 2L}, {}, {'mm': 7L}, {}, {}], [{'aa': 5L}, {}, {'mm': 7L}, {}, {}], [{'aa': 2L}, {}, {'mm': 9L}, {}, {}]] 
>>> 
3

У вас есть список списков, поэтому вам нужно отсортировать каждый подсписчик, если вы хотите заказать подсписок.

a_sorted = [sorted(sublist) for sublist in a] 

Очевидно, что вы можете запустить sorted() в списке отсортированных списков, если вы хотите, чтобы внешний список будет отсортирован тоже.

Вы можете передать sorted() встроенный аргумент key - функция, которая берет элемент списка и возвращает значение для сортировки. Немного неясно, как именно вы хотите отсортировать список, вы можете уточнить, хотя с этим вы должны иметь возможность разработать решение.

Однако структура данных немного странная. Где у вас есть пары в виде {key: value} вы обычно лучше с кортежем: (key, value), или одного, большим Словаре, который содержит все ваши пары в качестве ключей и значений, например:

a = [{'aa': 2L, 'mm': 7l}, {'aa': 2L, 'mm': 5L}, {'aa': 2L, 'mm': 9L}, {'aa': 2L, 'mm': 3L}] 

В этом случае, мы можем использовать sorted(a, key=itemgetter("mm")) - используя operator.itemgetter() - для сортировки по значению 'mm'.

Или, если вам нужны ваши пустые пары (без использования ключей к None, например), в виде кортежа:

a = [[('aa', 2L), (,), ('mm', 7L), (,), (,)], [('aa', 2L), (,), ('mm', 5L), (,), (,)], [('aa', 2L), (,), ('mm', 9L), (,), (,)], [('aa', 2L), (,), ('mm', 3L), (,), (,)]] 

Здесь мы можем сделать подобную вещь sorted(a, key=lambda sublist: sublist[2][1]) - мы используем lambda сделать функцию быстрой для извлечения второго элемента в третьем элементе в подсписке.

Если вы хотите сохранить структуру данных, как это - если, например, вы планируете расширять словари с большим содержанием, то подобный план будет работать sorted(a, key=lambda sublist: sublist[2]["mm"]) - на этот раз с помощью 'mm' для доступа в dict.