Сортировка dict с кортежами в качестве значений - PullRequest
4 голосов
/ 14 июня 2011

У меня есть структура, которая выглядит так:

{'key_info':(rank,raw_data1,raw_data2),'key_info2':....}

В основном мне нужно вернуть список ключей в отсортированном порядке, который отсортирован по полю ранга в кортеже.

мой код сейчас выглядит примерно так (diffs - это название структуры выше):

  def _sortRanked(self):
    print(type(self.diffs))
    return sorted(self.diffs.keys(), key=lambda x: x[1], reverse=True)

, который сейчас возвращает это, когда я запускаю его:

return sorted(self.diffs.keys(), key=lambda x: x[1], reverse=True)
IndexError: string index out of range

Я надеюсь, что кто-то сможет извлечь из этого хоть какой-то смысл и помочь мне.

EDIT:

я изменил его на:

  def _sortRanked(self):
    return sorted(self.diffs.keys(), key=lambda x: self.diffs[x][0], reverse=True)

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

R : 3.64486899669e-05 3605 11
P : 3.11612504885e-05 1528 4
C : 2.50018364323e-05 2316 7
Q : -3.49014288804e-05 152 2
T : -4.45535602789e-05 2623 11
Z : -0.000101817241062 491 6
q : -0.000301208352276 1812 19

полный вывод здесь: http://pastebin.com/e4eTYvgN

Ответы [ 4 ]

6 голосов
/ 14 июня 2011

keys() дает вам только ключи, а не значения, поэтому вы должны использовать ключи для извлечения значений из dict, если вы хотите отсортировать по ним:

return sorted(self.diffs.keys(), key=lambda x: self.diffs[x], reverse=True)

Поскольку вы сортируете по rank, который является первым элементом в кортеже, вам не нужно указывать, какой элемент в кортеже значения вы хотите отсортировать. Но если вы хотите отсортировать по raw_data1:

return sorted(self.diffs.keys(), key=lambda x: self.diffs[x][1], reverse=True)
2 голосов
/ 14 июня 2011

Вы передаете ключ в качестве аргумента key.

[k for (k, v) in sorted(D.iteritems(), key=lambda x: x[1], reverse=True)]
1 голос
/ 15 июня 2011

Вы пытаетесь отсортировать по ключам словаря, а не по значениям. Замените ваш self.diffs.keys() вызов на self.diffs.items(), и тогда он должен работать (но сохраняйте лямбду или используйте operator.itemgetter(1). Сортировка кортежей начинается с первого элемента, так что вам не нужно об этом беспокоиться.)

<Ч />

Просто заметил, что вам нужны только ключи. По моему предложению вам придется заключить сортировку в zip()[0] (обязательно распаковать результирующий список кортежей из сортировки, указав префикс * в вызове zip()).

0 голосов
/ 15 июня 2011

Ты рядом. Попробуйте вместо этого:

return sorted(self.diffs.keys(), key = lambda x: self.diffs[x][0], reverse = True)

Вы сортируете список ключей, поэтому вам нужно вернуть этот ключ обратно в словарь и извлечь элемент 1, чтобы использовать его в качестве значения сравнения.

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