【问题标题】:Sorting a list of tuples based on the first items根据第一项对元组列表进行排序
【发布时间】:2011-07-25 09:50:58
【问题描述】:

如何根据第一个值对元组列表进行排序,即在字典中我们可以使用sorted(a.keys())

如何处理元组列表?

如果这些是元组值

t = [('2010-09-11', 'somedata', somedata),
     ('2010-06-11', 'somedata', somedata),
     ('2010-09-12', 'somedata', somedata)]

元组应根据第一个字段中的日期进行排序。

【问题讨论】:

  • 您的意思是要对包含元组的列表进行排序?
  • 这只是 t.sort() 见:stackoverflow.com/questions/644170/…
  • @delan 但 OP 实际上并不想对元组进行排序,他想对元组列表进行排序。
  • 抱歉,这让我发疯了,它总是将我的答案发布为评论(说这是微不足道的)。此外,他排序 list 而不是元组
  • @Rajeev Writing "元组应该根据日期排序,第一个字段"是错误的。如果按第一个字段排序,则按字符串 排序。如果要按日期排序,则必须考虑字符串表示日期的方式,年-月-日年-日-月.

标签: python list sorting tuples


【解决方案1】:

通常,只有sorted(t) 有效,因为元组按lexicographical order 排序。如果您真的想忽略第一项之后的所有内容(而不是按以下元素对具有相同第一个元素的元组进行排序),您可以提供一个key 来挑选出第一个元素。最简单的方法是operator.itemgetter:

import operator
...
for item in sorted(t, key=operator.itemgetter(0)):
    ...

当然,如果你想对列表进行就地排序,你可以改用t.sort(key=operator.itemgetter(0))

【讨论】:

    【解决方案2】:

    或者您可以使用类似的方法来确保元组列表按日期排序:

    from datetime import datetime
    initData = [('2010-09-11','somedata',1), ('2010-06-11','somedata',2), ('2010-09-12','somedata',3)]
    outData = sorted(initData , key=lambda x: datetime.strptime(x[0],"%Y-%m-%d"))
    

    【讨论】:

    • 在你正在处理的情况下,也就是说日期字符串表示日期为 year-month-day ,没有必要诉诸 strptime():这样做是利用 struct_time 数据类型中包含的顺序,而可以利用被视为字符串的日期顺序,而无需应用 strptime( )。 - 但是,单独使用 strptime() 没有 strftime() 是可以的,我意识到关于订单的这一点。因此我赞成
    【解决方案3】:

    如果 '2010-09-11' 是年--日,您可以:

    somedata = 'jyhghg'
    t = [('2010-09-11','somedata',somedata),
         ('2010-06-11','somedata',somedata),
         ('2010-09-12','somedata',somedata),
         ('2010-08-12','somedata',somedata)]
    
    from operator import itemgetter
    t.sort(key = itemgetter(0))
    print t
    

    结果

    [('2010-06-11', 'somedata', 'jyhghg'),
     ('2010-08-12', 'somedata', 'jyhghg'),
     ('2010-09-11', 'somedata', 'jyhghg'),
     ('2010-09-12', 'somedata', 'jyhghg')]
    

    .

    如果 '2010-09-11' 是年-日-,您可以:

    from time import strptime,strftime
    
    somedata = 'jyhghg'
    t = [('2010-09-11','somedata',somedata),
         ('2010-06-11','somedata',somedata),
         ('2010-09-12','somedata',somedata),
         ('2010-08-12','somedata',somedata)]
    
    t.sort(key = lambda x: strftime('%Y%m%d',strptime(x[0],'%Y-%d-%m')))
    print t
    

    结果

    [('2010-06-11', 'somedata', 'jyhghg'),
     ('2010-09-11', 'somedata', 'jyhghg'),
     ('2010-08-12', 'somedata', 'jyhghg'),
     ('2010-09-12', 'somedata', 'jyhghg')]
    

    .

    编辑 1

    阅读Artsiom Rudzenka 的答案,他单独使用 strptime(),我意识到 strptime() 会产生一个 struct_time 对象是按性质排序的。这样的对象具有属性tm_year, tm_mon, tm_mday, tm_hour, tm_min, tm_sec, tm_wday, tm_yday, tm_isdst,可以通过常见的点表示法访问(例如toto.tm_mon),也可以通过索引表示法访问(toto[1] 例如),因为 struc_time 对象的属性是按此顺序注册的 tm_year, tm_mon, tm_mday, tm_hour, tm_min, tm_sec, tm_wday, tm_yday, tm_isdststruct_time 数据类型有一个命名元组的接口

    由于 struct_time 对象是按性质排序的,因此不必应用 strftime() 来获得具有此顺序的 year-month-day 的日期字符串:this struct_time 对象中已经存在顺序。

    然后,我针对 11 in '2010-06-11' 是 month 的情况更正我的代码:我消除strftime()

    from time import strptime
    
    somedata = 'jyhghg'
    t = [('2010-09-11','somedata',somedata),
         ('2010-06-11','somedata',somedata),
         ('2010-09-12','somedata',somedata),
         ('2010-08-12','somedata',somedata)]
    
    t.sort(key = lambda x: strptime(x[0],'%Y-%d-%m'))
    print t
    

    编辑 2

    考虑 Kirk Strauser 的信息:

    import re
    
    regx = re.compile('(\d{4})-(\d\d)-(\d\d)')
    
    somedata = 'jyhghg'
    t = [('2010-09-11','somedata',somedata),
         ('2010-06-11','somedata',somedata),
         ('2010-09-12','somedata',somedata),
         ('2010-08-12','somedata',somedata)]
    
    t.sort(key = lambda x: regx.match(x[0]).group(1,3,2))
    print t
    

    【讨论】:

    • 我没有想过年-日-月的可能性,+1。
    • @utdemir 谢谢。其实我也觉得中了陷阱,有一次,所以才回忆起来
    • 注意:对于这个用例,strptime 是可怕慢的。我写了一个函数来分割'-'上的日期字段,然后返回字段 0、2、1。使用 timeit,strptime 版本在 18.06 秒内运行,而字符串操作版本在 0.86 秒内运行。一般来说,除非您确实需要它返回的信息,否则请远离 strptime。
    • @Kirk Strauser 好的。不知道strptime()的慢,也没考虑过速度。差异很大,所以我更正了我的答案。请问您返回字段 0,1,2 的功能是什么?
    • 这很简单:def swapmonthday(date): fields = date.split('-'); return fields[0], fields[2], fields[1].
    【解决方案4】:

    你可以用很简单的

    t.sort()
    

    见:How does Python sort a list of tuples?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-21
      • 1970-01-01
      • 1970-01-01
      • 2018-08-17
      • 2021-12-14
      • 1970-01-01
      • 2022-01-18
      相关资源
      最近更新 更多