Sort()在Python for Dict中无法正常工作

时间:2012-11-05 00:31:14

标签: python sorting csv dictionary

我有一个包含许多列的CSV文件。我试图根据其中一列中的值(按降序数字顺序)对行进行排序。我只是输出前10个。然而,当我使用下面的代码时,我输出的输出不正确。

import csv
f = open('SNPs.csv', "rU")
reader = csv.reader(f)
output = [row for row in reader]
output.sort(key=lambda x: x[32], reverse=True)
print dict((row[10], (row[11], row[8], row[32])) for row in output[:10])

输出类似于:

'XRgroup8': ('38', '2', '0.47'), '2': ('30', '13', '0.37'), 'Chromosome': ('Position', 'Distance', 'GC'), 'XRgroup5': ('54', '1', '0.45')

很明显,它没有返回10个值,而且它们没有按顺序排列。有什么想法吗?

4 个答案:

答案 0 :(得分:2)

您需要知道的第一件事:
Python的dicts是无序的,因此无法排序。

如果您需要维护订单的字典,请查看http://docs.python.org/2/library/collections.html#collections.OrderedDict

第二件事:

dict的键是唯一的 如果您尝试添加已存在于dict中的键,则该值将被覆盖 这是你没有得到你所希望的所有元素的最可能原因。

答案 1 :(得分:1)

output列表已排序,但词典是无序的,这就是为什么在结果字典中看不到任何顺序

答案 2 :(得分:0)

您正在排序字符串(按字典顺序排序),但希望它们按数字顺序排序。这不会发生。您可能希望将排序key函数更改为:lambda x: float(x[32]),以便您根据以数字排序的浮点数进行排序。


另请注意,字典不会保留任何顺序(您可以使用collections.OrderedDict代替 - 但我认为您已经知道了这一点。)

答案 3 :(得分:0)

你跑的那一刻

print dict((row[10], (row[11], row[8], row[32])) for row in output[:10])

您已将已排序的输出(output.sort(...))转换为无顺序字典,而字典实际上是在Python中实现为哈希表。有关详细说明 - http://mail.python.org/pipermail/python-list/2000-March/048085.html