我相信,我没有做过于复杂的事情。我正在预先分配一个大的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]))
答案 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))