【发布时间】:2021-03-24 03:19:08
【问题描述】:
我正在尝试使用key=operator.itemgetter() 对数据字段进行排序。当我尝试为第 4 列自定义它时,它没有正确排序。这是第一个排序和结果。
import csv import operator
with open('test.csv', 'r', ) as test_file:
test_reader = csv.reader(test_file, delimiter=',')
list = sorted(test_reader, key=operator.itemgetter(0))
for row in list:
print(" ".join(row))
这是我得到正确排序的 ID 字段的输出
1009453, Lenovo, tower, 599, 10/1/2020,
1167234, Apple, phone, 534, 2/1/2021,
2347800, Apple, laptop, 999, 7/3/2020,
2390112, Dell, laptop, 799, 7/2/2020,
3001265, Samsung, phone, 1200, 12/1/2023,
7346234, Lenovo, laptop, 239, 9/1/2020, damaged
9034210, Dell, tower, 345, 5/27/2020,
但是当我尝试按价格排序时:
3001265, Samsung, phone, 1200, 12/1/2023,
7346234, Lenovo, laptop, 239, 9/1/2020, damaged
9034210, Dell, tower, 345, 5/27/2020,
1167234, Apple, phone, 534, 2/1/2021,
1009453, Lenovo, tower, 599, 10/1/2020,
2390112, Dell, laptop, 799, 7/2/2020,
2347800, Apple, laptop, 999, 7/3/2020,
这里的价格从 1200 降到 239 再到 345,为什么排序不正确?我为获得排序价格而改变的只是这个list = sorted(test_reader, key=operator.itemgetter(0)) 到这个list = sorted(test_reader, key=operator.itemgetter(3))。当我尝试按日期排序或key=operator.itemgetter(4)) 日期不会按时间顺序排序时,也会发生同样的情况。
【问题讨论】:
-
您需要将价格转换为数字。它们是字符串,使它们按字母顺序排序。
-
看起来它们是作为字符串而不是整数进行比较的。你可以做
sorted(a,key=lambda x: int(x[3])) -
@venky__ 您的解决方案似乎有效,您能解释一下 lambda 的工作原理吗?
-
@PythonStudent 一个 lambda 表达式创建一个函数对象。在这种情况下,
lambda x: int(x[3])相当于定义了一个函数def f(x): return int(x[3])。见stackoverflow.com/questions/16501/what-is-a-lambda-function -
请不要破坏您的帖子。您可以通过单击底部的“删除”选项来删除它们。如果该选项不存在(这取决于其他参数,例如是否已回答),您可以联系 Stack Overflow(单击站点页脚中的“联系我们”链接)并请求取消与您帐户的关联。