【问题标题】:Sort() not working correctly in Python for DictSort() 在 Python for Dict 中无法正常工作
【发布时间】:2012-10-24 20:08:12
【问题描述】:

我有一个包含许多列的 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 个值,而且它们也没有按顺序排列。有什么想法吗?

【问题讨论】:

  • 什么是len(output)?您希望的最终输出是什么?
  • 你可以做output = list(reader),或者更好,output = sorted(reader, key= ..., reverse=True)
  • @mgilson 是的,那行得通,但是,我可以在仍然只输出那些特定列的同时这样做吗? (10, 11, 8, 32)

标签: python sorting csv dictionary


【解决方案1】:

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

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

第二件事:

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

【讨论】:

    【解决方案2】:

    你奔跑的那一刻

    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

    【讨论】:

      【解决方案3】:

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


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

      【讨论】:

      • 当我尝试转换为浮点数时,它返回一个 ValueError "Could not convert string to float"
      • @gr8skillz -- 那么你的字符串中有一些不能转换为浮点数的东西 -- 也许你的数据文件已经损坏了?尝试找出无法转换的字符串的值,它可能会阐明为什么会出现该错误
      • 刚刚意识到这是我的专栏的标题。哎呀。
      • @gr8skillz -- 你会在产生'Chromosome': ('Position', 'Distance', 'GC') 的行上得到一个错误 -- 'GC' 不能转换为浮点数。
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-10-09
        • 2022-01-22
        • 1970-01-01
        • 2017-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多