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

时间:2014-05-07 10:51:21

标签: python list sorting python-2.7 dictionary

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

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

2 个答案:

答案 0 :(得分:5)

您需要在第一个索引上对进行排序(所以0为基于零的索引),然后告诉{ {1}}要颠倒顺序:

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]] 并使用lambda访问仅有值的第一个索引:

dict.items()

演示:

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

答案 1 :(得分:1)

您可以对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