2

我相信我并没有做任何过于复杂的事情。我正在对一个大型 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]))
4

5 回答 5

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

于 2011-05-31T21:21:38.900 回答
1

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

    sorted(reader, key=lambda x: float(x[1]))
于 2011-05-31T21:19:25.183 回答
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']
于 2011-05-31T21:20:31.840 回答
0

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

于 2011-05-31T21:21:51.943 回答
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))
于 2011-05-31T21:38:39.277 回答