按值数组的python排序字​​典

MrF*_*onk 0 python sorting dictionary list python-2.7

我有一个数组作为元素的字典.说:

masterListShort = {'a': [5, 2, 1, 2], 'b': [7, 2, 4, 1], 'c': [2, 0, 1, 1]}
Run Code Online (Sandbox Code Playgroud)

我想通过值的第一个元素反向排序这个字典.然后我想将输出写入制表符分隔文件,如下所示:

<key>    <value1>    <value2>    <value3>    etc.
Run Code Online (Sandbox Code Playgroud)

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

# 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()
Run Code Online (Sandbox Code Playgroud)

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

b    7    2    4    1
c    5    2    1    2
a    2    0    1    1
Run Code Online (Sandbox Code Playgroud)

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

import operator
sorted(myDict, key=operator.itemgetter(1))
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 5

您需要在第一个索引上对进行排序(因此对于从零开始的索引),并告诉要反转顺序:0sorted()

import operator

sorted(myDict.values(), key=operator.itemgetter(0), reverse=True)
Run Code Online (Sandbox Code Playgroud)

如果没有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]]
Run Code Online (Sandbox Code Playgroud)

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

sorted(myDict.items(), key=lambda i: i[1][0], reverse=True)
Run Code Online (Sandbox Code Playgroud)

演示:

>>> 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])]
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,实际上只有第一个元素排序就没那么多了; 您可以将列表自然排序:

sorted(myDict.values(), reverse=True)  # sort just the values
sorted(myDict.items(), key=operator.itemgetter(1), reverse=True)  # sort items
Run Code Online (Sandbox Code Playgroud)

列表列表按字典顺序排序; 如果第一个元素相等,则根据第二个元素等排序两个列表.

要将其写入制表符分隔文件,请使用该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)
Run Code Online (Sandbox Code Playgroud)