我有一个看起来像这样的结构:
{'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
答案 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才能将其用作比较值。