Сортировка в питоне с диктом - PullRequest
0 голосов
/ 19 июля 2011

У меня есть массив диктов. Это работает

tickets.sort(key=itemgetter('start')), однако, если старты равны друг другу, мне нужен второй критерий для сортировки (если есть простой способ сделать это, который решит все), поэтому я бы хотел написать свой собственный вид. Я делал это раньше, в форме

tickets.sort(sort_function)

но это не работает, я получаю

unhashable type: 'dict' error. 

Есть ли способ сделать это?

EDIT

Я забыл что-то важное. По второму критерию это не просто больший / меньший случай. Это по принципу, если start == "конкретный", вернуть -1

Ответы [ 3 ]

5 голосов
/ 19 июля 2011

Вы можете просто передать второй параметр itemgetter, и он создаст для вас необходимую функцию:

tickets.sort(key = itemgetter('start', 'end'))
1 голос
/ 19 июля 2011

… однако, если старты совпадают, мне нужен второй критерий для сортировки (если есть простой способ сделать это, то все решится)

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

Например, приведен список элементов с двумя числами, где сортировка должна выполняться по возрастанию по первому (более значимому) числу и по убыванию по второму:

>>> data = [
...   (1, 0),
...   (1, 1),
...   (1, 2),
...   (0, 0),
...   (2, 0),
... ]
>>> data.sort(key=lambda (a, b): (a, -b))
>>> data
[(0, 0), (1, 2), (1, 1), (1, 0), (2, 0)]

Я забыл что-то важное. По второму критерию это не просто больший / меньший случай. Это по аналогии, если start == "конкретный", вернуть -1

Используйте ваши специальные значения в более поздних элементах кортежа таким образом, чтобы они превращались в простое сравнение <, == или>:

def ticket_key(ticket):
  start = ticket["start"]
  if start == "specific":
    second = -1
  else:
    second = ticket["blah"]
  return (start, second)

tickets.sort(key=ticket_key)

Теперь для элементов, где ticket ["start"] является "специфичным", вместо ticket ["blah"] используется -1:

>>> data = [
...   {"start": "specific"}, # "blah" doesn't even exist here
...   {"start": "specific", "blah": 2},
...   {"start": "42", "blah": 1},
...   {"start": "42", "blah": 0},
... ]
>>> data.sort(key=ticket_key)
>>> data
[{'start': '42', 'blah': 0},
 {'start': '42', 'blah': 1},
 {'start': 'specific'},
 {'start': 'specific', 'blah': 2}]
0 голосов
/ 19 июля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...