【问题标题】:How to properly use key=operator.itemgetter() to sort the data correctly?如何正确使用 key=operator.itemgetter() 对数据进行正确排序?
【发布时间】: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(单击站点页脚中的“联系我们”链接)并请求取消与您帐户的关联。

标签: python csv sorting


【解决方案1】:

价格是字符串(就像从 CSV 读取的所有列一样),因此数据按字典顺序排序。您需要将它们显式转换为数字才能按数字排序,例如:

lst = sorted(test_reader, key=lambda x : int(x[3]))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    相关资源
    最近更新 更多