【问题标题】:Sorting a list of tuples by date按日期对元组列表进行排序
【发布时间】:2011-01-12 19:01:22
【问题描述】:

我想排序并返回按日期排序的元组的一部分。

我只想将第一条到第四条记录(tuple[:3])排序并打印出来。

tuple = [('Dec 1, 2010', '7.41', '7.60', '7.37'), 
         ('Dec 4, 2010', '7.41', '7.60', '7.37'), 
         ('Dec 2, 2010', '7.41', '7.60', '7.37'), 
         ('Dec 20, 2010', '7.41', '7.60', '7.37'), 
         ('Dec 16, 2010', '7.41', '7.60', '7.37'), 
         ('Jan 2, 2011', '7.41', '7.60', '7.37')]

我试过了:

import operator
sorted(tuple[:3], key=operator.itemgetter('date'), reverse=True)

但是,它返回错误“TypeError: tuple indices must be integers, not str.

【问题讨论】:

  • 不要调用列表tuple。它隐藏了内置的tuple,一个容器。

标签: python sorting date tuples


【解决方案1】:

你为什么要通过date?不是您要查找的元组的第一个元素吗?

sorted(records[:3], key=operator.itemgetter(0), reverse=True)

顺便说一句,在比较它们之前,您应该将字符串转换为实际日期。也许:

from datetime import datetime
def get_date(record):
     return datetime.strptime(record[0], "%b %d, %Y")
sorted(records[:3], key=get_date, reverse=True)

我已将 tuple 重命名为 records。正如其他人指出的那样,通过使用 tuple 您正在隐藏类型构造函数;同样重要的是:它是一个列表而不是元组,变量应该是复数(因为它存储一个集合),并且它应该有一个有意义的名称。

【讨论】:

    【解决方案2】:

    首先,[] 不是元组,它被称为列表(参见this post on daniweb.com)。

    其次,在dictionary 中,您将key 链接到value。由于列表是一维的,因此只能通过请求索引来获取值。

    >> dic = {'date' : 'value', 'bla' : 'foo'}
    >> dic['date']
    value
    >> dic['bla']
    foo
    
    >> list = ['a', 'b', 'c']
    >> list[0]
    a
    >> list[2]
    c
    

    您很可能希望在对日期进行排序之前将其转换为 datetime.datetime 对象。由于它们是字符串(在您的示例中),它们将按日期按字母顺序排序而不是

    【讨论】:

      【解决方案3】:

      文字'date' 并不神奇。 operator.itemgetter 使用它传递的任何内容作为它正在查看的任何内容的索引。它不会试图理解'date' 的含义。

      'date' 是一个字符串。 dict 的键是字符串。您的列表中有tuples。 tuple 的键是整数,从 0 开始。

      此外,使用key 进行排序只是说“一旦你从每个项目中获得了键,就根据键值对项目进行排序,正常解释键值”。您的每个 tuple 的开头项目并不是神奇的某种 Date 对象,因为它们看起来像您和我的日期。它们是字符串,会像字符串一样进行比较。

      @tokland 展示了如何为“给定其中一个元组,使用 datetime 模块获取开始元素并将其转换为日期”操作设置代码。然后他使用这个键操作来调用排序。

      【讨论】:

        【解决方案4】:

        问题在于您要的是密钥'date'。只有当数据元素是包含'date' 的字典时,这才有效。

        正如 tokland 指出的那样,您需要使用 0,因为这是您要求的元组的第一个元素。

        另外,请务必不要将您的 tuple 实际命名为“元组”:这是类型本身的名称,您不想将其替换为其他值。

        【讨论】:

        • 实际上,他有一个元组列表。
        • 对,我也注意到了。
        猜你喜欢
        • 1970-01-01
        • 2014-10-19
        • 2020-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多