【问题标题】:Sorting a dict with tuples as values以元组为值对字典进行排序
【发布时间】:2011-09-15 00:16:57
【问题描述】:

我有一本像这样的字典:

{'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

【问题讨论】:

    标签: python sorting dictionary tuples


    【解决方案1】:

    keys() 只给你键,而不是值,所以如果你想对它们进行排序,你必须使用键从字典中检索值:

    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】:

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

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

    【讨论】:

    • 您忘记了reverse=True 部分。
    【解决方案3】:

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


    刚刚注意到您只想要钥匙。根据我的建议,您必须使用zip()[0] 包装排序(确保在对zip() 的调用中以* 为前缀从排序中解压缩生成的元组列表)。

    【讨论】:

      【解决方案4】:

      你已经接近了。试试这个:

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

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

      【讨论】:

      • 这确实有效,但它似乎以无意义的顺序排序...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
      猜你喜欢
      • 1970-01-01
      • 2017-08-21
      • 2020-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-13
      • 2015-05-14
      • 1970-01-01
      相关资源
      最近更新 更多