Python按值数组排序字典



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

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))

您需要对进行排序,然后在第一个索引上(因此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模块;它将负责将值转换为字符串,编写TAB分隔符并处理换行符:

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)

您可以对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()是一个2D列表;每个元素都是一个元组,其中第一个元素是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

最新更新