用sorted()排序Python中的csv文件时返回程序员降序,而不是时间降序
我觉得我做的事情并不复杂。我正在对一个很大的csv数据文件进行预排序,因为里面的数据是随机时间顺序到达的。索引是正确的,但返回的格式不对。
sortedList=sorted(reader,key=operator.itemgetter(1))
所以我得到的排序结果是 [-1 -10 -100 0 100 5000 60],而不是我期望的 [-100 -10 -1 0 10 100 5000 6000]。
我尝试了lambda函数的例子和itemgetter,但我不知道接下来该怎么做。
谢谢大家的帮助。
我问题的答案在评论里。原来数值是作为字符串排序的,而不是作为数字。我不知道可以在sorted()里指定键的类型。这个代码按我想要的方式工作:
sortedList=sorted(reader,key=lambda x:float(x[1]))
5 个回答
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))
1
看起来“reader”输出的是字符串,而你想要的是整数。你可以试试下面这样的代码:
sorted(reader, key=lambda x: float(x[1]))
3
从你看到的输出结果来看,这些数据似乎是按照字符串的方式排序的,而不是数字的方式。
所以你可以这样做:
sortedList=sorted(reader, key=lambda t: int( t[1] ))
或者
sortedList=sorted(reader, key=lambda t: float( t[1] ))
更好的方法是,在创建reader
的时候,确保它里面填充的是数字,而不是字符串。你可以使用QUOT_NONNUMERIC作为reader
的一个参数来实现这个,具体可以参考这个链接:http://docs.python.org/library/csv.html#csv.QUOTE_NONNUMERIC。