使用sorted()在Python中对csv文件进行排序会以程序员DESC顺序返回值,而不是时间DESC顺序

时间:2011-05-31 21:04:54

标签: python numerical sorted

我相信,我没有做过于复杂的事情。我正在预先分配一个大的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,但我真的不知道从那里去哪里。

感谢您的帮助。

我的问题的答案在评论中。数值被排序为字符串而不是数字。我不知道我可以在sorted()中指定密钥的数据类型。此代码按我的意图运行:

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

5 个答案:

答案 0 :(得分:3)

从您在那里看到的输出看起来,它们看起来像是字符串而不是数字。

所以你可以这样做:

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

答案 1 :(得分:1)

看起来“读者”产生字符串,你想要的是整数。你可以尝试类似的东西:

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

答案 2 :(得分:0)

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

>>> 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']

答案 3 :(得分:0)

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

答案 4 :(得分:0)

我喜欢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))