【问题标题】:Sorting a csv file in Python with sorted() returns values in programmer DESC order, not time DESC order使用 sorted() 在 Python 中对 csv 文件进行排序,以程序员 DESC 顺序返回值,而不是时间 DESC 顺序
【发布时间】:2011-05-31 21:04:53
【问题描述】:

我相信我并没有做任何过于复杂的事情。我正在对一个大型 csv 数据文件进行预排序,因为它充满了以随机时间顺序到达的数据。索引正确,但返回格式已关闭。

    sortedList=sorted(reader,key=operator.itemgetter(1))

所以不要像 [-100 -10 -1 0 10 100 5000 6000];我得到 [-1 -10 -100 0 100 5000 60]

我尝试了 lambda 函数示例和 itemgetter,但我真的不知道从那里去哪里。

感谢您的帮助。

我的问题的答案在 cmets 中。数值被排序为字符串而不是数字。我不知道我可以在 sorted() 中指定键的数据类型。此代码按我的预期工作:

    sortedList=sorted(reader,key=lambda x:float(x[1]))

【问题讨论】:

  • 如果您在阅读器中发布数据示例会有所帮助。
  • 阅读器字符串中的内容吗?然后你会得到基于字符串的排序来解释结果。如果是整数,则返回正确的列表

标签: python numerical sorted


【解决方案1】:

仅从您在此处看到的输出来看,它们似乎被排序为字符串而不是数字。

所以你可以这样做:

sortedList=sorted(reader, key=lambda t: int( t[1] ))

sortedList=sorted(reader, key=lambda t: float( t[1] ))

或者更好的是,尝试确保序列 reader 在创建时填充数字而不是字符串,可能使用 QUOTE_NONNUMERIC 作为读取器的 fmtparam(请参阅 http://docs.python.org/library/csv.html#csv.QUOTE_NONNUMERIC)。

【讨论】:

  • 欢迎。请注意,严格来说,您并没有在键中指定数据的类型 - 只是 float(x) 让您将 x 从字符串转换为浮点数。实际上,您可以使用一个变量的任意复杂函数作为您的 key - 使用 lambda 或像 def f(t): return float( t[1] ) 这样的内部函数(在这种情况下,您在进行排序时使用 key=f
【解决方案2】:

看起来“阅读器”产生字符串,而您想要的是整数。你可以试试这样的:

    sorted(reader, key=lambda x: float(x[1]))

【讨论】:

  • 它们是“双打”,因为它们代表时间价值。我尝试了您的代码,但它对此感到窒息: ValueError: invalid literal for int() with base 10: '0.06949624419212341'
  • @mike : 试试 float 而不是 int。
【解决方案3】:

看起来您的数字是按字母顺序(作为字符串)而不是按数字排序的:

>>> sorted([10,2000,30])
[10, 30, 2000]
>>> sorted(['10','2000','30'])
['10', '2000', '30']

要解决此问题,您可以传递数字排序:

def numeric_compare(x, y):
    return int(x)-int(y)

>>> sorted(['10','2000','30'],cmp=numeric_compare)
['10', '30', '2000']

【讨论】:

    【解决方案4】:

    您的列表似乎被排序为字符串而不是数字。当您读入 CSV 文件时,它仍然是文本,必须先转换为整数。

    【讨论】:

      【解决方案5】:

      我喜欢compose

      from operator import itemgetter
      
      def compose(f, g):
          return lambda *a, **k: g(f(*a, **k))
      
      sortedList = sorted(reader, key=compose(itemgetter(1), float))
      

      【讨论】:

        猜你喜欢
        • 2014-08-21
        • 1970-01-01
        • 2020-09-12
        • 1970-01-01
        • 1970-01-01
        • 2015-07-22
        • 2012-12-14
        • 2012-01-13
        • 1970-01-01
        相关资源
        最近更新 更多