【问题标题】:python sort dictionary by value arraypython按值数组排序字典
【发布时间】:2014-06-24 07:28:01
【问题描述】:

我有一个以数组为元素的字典。 说:

masterListShort = {'a': [5, 2, 1, 2], 'b': [7, 2, 4, 1], 'c': [2, 0, 1, 1]}

我想按值的第一个元素对该字典进行反向排序。 然后我想将我的输出写入一个制表符分隔的文件,如下所示:

<key>    <value1>    <value2>    <value3>    etc.

我将字典写入文件的当前代码如下所示:

# write the masterListShort to file
outFile2 = open('../masterListShort.tsv', 'w')
for item in sorted(masterListShort):
    tempStr = '\t'.join(map(str, masterListShort[item]))
    outFile2.write(str(item) + '\t' + tempStr + '\n')

outFile2.close()

此代码工作正常,只是不对列表进行排序。 我希望我的输出以制表符分隔的文件格式编写。 所以:

b    7    2    4    1
c    5    2    1    2
a    2    0    1    1

到目前为止,我已经找到了以下命令,并且想知道是否可以将它们应用到我的代码中:

import operator
sorted(myDict, key=operator.itemgetter(1))

【问题讨论】:

  • 请测试您的样品;您的示例字典使用了完全不正确的语法。
  • 对不起,我只是从头开始写的。

标签: python list sorting python-2.7 dictionary


【解决方案1】:

您需要对 values 进行排序,然后在 first 索引上(所以 0 用于从零开始的索引),并告诉 sorted() 反转顺序:

import operator

sorted(myDict.values(), key=operator.itemgetter(0), reverse=True)

如果没有 dict.values() 调用,您将尝试对键进行排序。

演示:

>>> import operator
>>> myDict = {'a': [5, 2, 1, 2], 'b': [7, 2, 4, 1], 'c': [2, 0, 1, 1]}
>>> sorted(myDict.values(), key=operator.itemgetter(0), reverse=True)
[[7, 2, 4, 1], [5, 2, 1, 2], [2, 0, 1, 1]]

如果您想输出键值对,则使用dict.items() 并使用 lambda 访问仅值的第一个索引:

sorted(myDict.items(), key=lambda i: i[1][0], reverse=True)

演示:

>>> sorted(myDict.items(), key=lambda i: i[1][0], reverse=True)
[('b', [7, 2, 4, 1]), ('a', [5, 2, 1, 2]), ('c', [2, 0, 1, 1])]

在这两种情况下,实际上按第一个元素排序只是并没有太大意义;您可以让列表自然排序:

sorted(myDict.values(), reverse=True)  # sort just the values
sorted(myDict.items(), key=operator.itemgetter(1), reverse=True)  # sort items

因为列表的列表是按字典顺序排序的;如果第一个元素相等,则根据第二个元素对两个列表进行排序,依此类推。

要将其写入制表符分隔的文件,请使用csv 模块;它将负责将值转换为字符串、编写制表符分隔符和处理换行符:

import csv

with open('../masterListShort.tsv', 'wb') as outfh:
    writer = csv.writer(outfh, delimiter='\t')
    for key, values in sorted(myDict.items(), key=operator.itemgetter(1), reverse=True):
        writer.writerow([key] + values)

【讨论】:

  • 是的,我有这个。我在这里遇到的问题是我无法再获得原始密钥。 (我想把我的输出写成键+值)
  • @MrFronk:那你为什么不要求呢?您的示例输出仅显示了值。
  • 我重新提出了我的问题,我希望问题现在很清楚。造成不便,敬请见谅
  • @MrFronk:我现在也为你添加了一个关于编写 TSV 文件的部分;它将每行写入 key value0 value1 ... valueN,行按 value0 排序。
【解决方案2】:

你可以对dict.items()给出的元组列表进行排序;

myDict = {'a': [5, 2, 1, 2], 'b': [7, 2, 4, 1], 'c': [2, 0, 1, 1]}

print myDict.items()
#[('a', [5, 2, 1, 2]), ('c', [2, 0, 1, 1]), ('b', [7, 2, 4, 1])]

print sorted(myDict.items(), key=lambda x: x[1][0], reverse=True))
#[('c', [2, 0, 1, 1]), ('a', [5, 2, 1, 2]), ('b', [7, 2, 4, 1])]

sorted 的 key 关键字参数是您提供给它的一个函数,它返回该函数可以用来对您给它进行排序的列表中的每个元素进行排序的东西。

lambda x: x[1][0] 只是一种快速创建函数的方法;

print sorted(myDict.items(), key=lambda x: x[1][0])

一样
def sortFunction(x):
  return x[1][0]

print sorted(myDict.items(), key=sortFunction)

它给出x[1][0] 的原因是列表 myDict.items() 是一个二维列表;每个元素都是一个元组,其中第一个元素是key,第二个元素是value。所以x[1] 是值(即分配给每个键的列表)。你想对它们的第一个值进行排序,所以我们对x[1][0]进行排序。

现在只需以您想要的格式打印它们;

for key, value in sorted(myDict.items(), key=sortFunction, reverse=True):
  print key + "\t" + "\t".join([str(v) for v in value])

这将给出:

b   7   2   4   1
a   5   2   1   2
c   2   0   1   1

【讨论】:

  • 我重新提出了我的问题,我希望问题现在很清楚。造成不便,敬请见谅
猜你喜欢
  • 2017-01-23
  • 2021-05-01
  • 1970-01-01
  • 2021-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-01
  • 2017-05-30
相关资源
最近更新 更多