Python: сортировка словаря списков

Я нашел то, что я искал в документах Apple. Короче говоря можно настроить объекты как свойства, которые Вы выпускаете и сохраняете (или просто @property, @synthesize), но Вы не имеете к для вещей как UILabels:

http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/chapter_3_section_4.html#//apple_ref/doc/uid/10000051i-CH4-SW18

36
задан Bastien Léonard 1 August 2009 в 19:17
поделиться

3 ответа

Вот один из способов сделать это:

>>> sorted(myDict.items(), key=lambda e: e[1][2])
[('item2', [8, 2, 3]), ('item1', [7, 1, 9]), ('item3', [9, 3, 11])]

Ключ аргумент функции sorted позволяет получить ключ сортировки для каждого элемента списка.

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

>>> for key, value in sorted(myDict.items(), key=lambda e: e[1][2]):
...   print key, value
... 
item2 [8, 2, 3]
item1 [7, 1, 9]
item3 [9, 3, 11]
43
ответ дан 27 November 2019 в 06:05
поделиться

Как сказал Джон Махлин, вы не можете сортировать словарь Python.

Однако вы можете создать индекс ключей, который можно сортировать в любом порядке.

Предпочтительный шаблон (идиома) Python для сортировки по любому альтернативному критерию называется «декорировать-сортировать-не декорировать» (DSU). В этой идиоме вы создаете временный список, который содержит кортежи вашего ключа (ключей), за которыми следуют исходные элементы данных, а затем вызываете обычный метод .sort () для этого списка (или, в более поздних версиях Python просто обернет ваше украшение в вызываемую встроенную функцию sorted () ). Затем вы удаляете "украшения".

Причина, по которой это обычно предпочтительнее передачи функции сравнения методу .sort () , заключается в том, что Python ' Встроенный код сортировки по умолчанию (скомпилированный на C в обычном Python на C) очень быстр и эффективен в случае по умолчанию, но намного, намного медленнее, когда ему приходится вызывать объектный код Python много-много раз в случае, отличном от стандартного. Так что обычно гораздо лучше перебирать данные, создавая структуры данных, которые могут быть переданы стандартным процедурам сортировки.

В этом случае вы должны иметь возможность использовать что-то вроде:

[y[1] for y in sorted([(myDict[x][2], x) for x in myDict.keys()])]

... это понимание списка, выполняющее undecorate из отсортированного списка кортежей, который возвращается пониманием внутреннего списка. Внутреннее понимание - это создание набора кортежей, желаемого ключа сортировки (3-й элемент списка) и ключа словаря, соответствующего ключу сортировки. myDict.keys (), конечно же, метод словарей Python, который возвращает список всех допустимых ключей в любом порядке, выбранном базовой реализацией - предположительно, простая итерация по хешам.

Более подробный способ сделать это может быть проще для чтения:

temp = list()
for k, v in myDict.items():
    temp.append((v[2],))
temp.sort()
results = list()
for i in temp:
    results.append(i[1])

Обычно такой код следует создавать итеративно в интерпретаторе с использованием небольших выборок данных. Создайте выражение или функцию "украшения". Затем заверните это в вызов sorted () . Затем создайте выражение без декорирования (которое обычно так же просто, как то, что я показал здесь).

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

Затем заверните это в вызов sorted () . Затем создайте выражение без декорирования (которое обычно так же просто, как то, что я показал здесь).

3
ответ дан 27 November 2019 в 06:05
поделиться

Вы заявили о двух совершенно разных желаниях:

  1. «Я хочу отсортировать словарь списков ...»
  2. «Я хочу иметь возможность перебирать словарь в порядке ... »

Первый из них по определению невозможен - сортировка чего-либо подразумевает перестановку в каком-то порядке. Словари Python по своей сути неупорядочены. Второй вариант вряд ли возможен, но крайне маловероятен.

Что вы можете сделать, так это

  1. Сделать копию содержимого словаря (что будет весьма

Первый из них по определению невозможен - сортировка чего-либо подразумевает перестановку в некотором порядке. Словари Python по своей сути неупорядочены. Второй вариант вряд ли возможен, но крайне маловероятен.

Что вы можете сделать, так это

  1. Сделать копию содержимого словаря (что будет весьма

Первый из них по определению невозможен - сортировка чего-либо подразумевает перестановку в некотором порядке. Словари Python по своей сути неупорядочены. Второй вариант вряд ли возможен, но крайне маловероятен.

Что вы можете сделать, так это

  1. Сделать копию содержимого словаря (что будет весьма unordered)
  2. Sort that
  3. Итерации по отсортированным результатам - и у вас уже есть два решения для этого. Кстати, решение, которое использует вместо "cmp" лучше; см. sorted

«третий элемент в списке» для меня пахнет «третьим элементом в кортеже», а «e [1] [2]» просто пахнет :-) ... вам может понравиться исследовать использование именованных кортежей вместо списков; см. фабрика именованных кортежей

Если вы собираетесь часто выполнять извлечение / сортировку / обработку больших наборов данных, вы можете рассмотреть что-то подобное, используя поставляемый Python модуль sqlite3:

create table ex_dict (k text primary key, v0 int, v1 int, v2 int);
insert into ex_dict values('item1', 7, 1, 9);
-- etc etc 
select * from ex_dict order by v2;
3
ответ дан 27 November 2019 в 06:05
поделиться
Другие вопросы по тегам:

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