0

我有一个包含许多列的 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

4 回答 4

2

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

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

第二件事:

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

于 2012-11-05T00:38:29.093 回答
1

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

于 2012-11-05T00:36:38.503 回答
0

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


另请注意,字典不会保留任何该顺序(您可以使用 acollections.OrderedDict代替——但我假设您已经知道这一点)。

于 2012-11-05T00:36:57.960 回答
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

于 2012-11-05T00:37:22.203 回答