使用元组作为值对dict进行排序

时间:2011-06-14 19:56:12

标签: python sorting

我有一个看起来像这样的结构:

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

基本上我需要按照排序顺序返回一个键列表,它是根据元组中的rank字段排序的。

我的代码现在看起来像这样(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

我希望有人可以从中理解并帮助我。

编辑:

我改为:

  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 个答案:

答案 0 :(得分:6)

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)

答案 1 :(得分:2)

您将密钥作为参数传递给,呃,key

[k for (k, v) in sorted(D.iteritems(), key=lambda x: x[1], reverse=True)]

答案 2 :(得分:1)

您试图对字典的键进行排序,而不是值。将self.diffs.keys()调用替换为self.diffs.items(),然后它应该有效(但请保留lambda,或使用operator.itemgetter(1)。元组从第一个元素开始排序,因此您不必担心这一点。)


注意到你只想要钥匙。根据我的建议,您必须使用zip()[0]包装排序(确保通过在*的调用中使用zip()加前缀来解析排序中的元组结果列表。

答案 3 :(得分:0)

你很亲密。试试这个:

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

您正在对键列表进行排序,因此您必须将该键带回字典并检索元素1才能将其用作比较值。