【问题标题】:Comparing a list of tuples比较元组列表
【发布时间】:2017-04-27 11:18:55
【问题描述】:

我想比较一个元组列表,如果第一个元素相同,则比较第二个元素并返回最高的。

lis = [(1,10, "n"), (1,15,"n1"), (2,20,"n"),(2,35,"n1"),(3,123,"n"),(3,12,"n1")]

返回:

lis = [(1,15,"n1"), (2,35,"n1"), (3,123,"n")]

我不知道该怎么做,任何帮助将不胜感激。

【问题讨论】:

    标签: python list python-3.x tuples


    【解决方案1】:

    我会使用itertools.groupby 首先将具有相同第一个元素的所有项目组合在一起,然后使用max 查找具有最大第二个元素的项目。

    与其他一些答案不同,您可能有来自不同“组”的不同数量的元素。

    from itertools import groupby
    from operator import itemgetter
    
    lis = [(1,10, "n"), (1,15,"n1"), (2,20,"n"), (2,35,"n1"), (3,123,"n"),(3,12,"n1")]
    
    lis.sort(key=itemgetter(0))  # groupby requires the iterable to be sorted,
                                 # so making sure it is
    
    grouped_by = groupby(lis, key=itemgetter(0))
    
    output = [max(li, key=itemgetter(1)) for group, li in grouped_by]
    print(output)
    
    # [(1, 15, 'n1'), (2, 35, 'n1'), (3, 123, 'n')]
    

    【讨论】:

      【解决方案2】:

      元组比较已经这样做了,先比较第一个元素,然后比较第二个元素,然后继续进行,直到找到决胜局。

      您需要做的只是zip 列表以创建正确的比较:

      zip(lis[::2], lis[1::2])
      # This produces:
      # (1, 10, 'n') (1, 15, 'n1')
      # (2, 20, 'n') (2, 35, 'n1')
      # (3, 123, 'n') (3, 12, 'n1')
      

      创建您需要的配对,然后您可以在列表理解中比较它们以获得想要的结果:

      r = [i if i > j else j for i,j in zip(lis[::2], lis[1::2])]
      print(r)
      # [(1, 15, 'n1'), (2, 35, 'n1'), (3, 123, 'n')]
      

      【讨论】:

      • 这仅在列表包含每个“类型”的 2 个元素时才有效。
      • 从样本来看,没有明确的说明,我很确定这是@DeepSpace 的唯一情况。如果需要,可以使用带有fillvalue()zip_longest
      • result = [[j,i][i>j] for i,j in zip(lis[::2],lis[1::2])] 在某种程度上更“pythonic”不是吗?
      • @Claudio 我不会这么说的。这显然比这里的解决方案可读性差。搜索一下,您会看到其他人提出的许多关于您正在使用的索引技巧以及它如何绊倒他们的问题 :-)
      【解决方案3】:

      使用range()max()函数的解决方案:

      lis = [(1,10, "n"), (1,15,"n1"), (2,20,"n"),(2,35,"n1"),(3,123,"n"),(3,12,"n1")]
      result = [max(lis[i:i+2]) for i in range(0, len(lis), 2)]
      
      print(result)
      

      输出:

      [(1, 15, 'n1'), (2, 35, 'n1'), (3, 123, 'n')]
      

      【讨论】:

      • 这仅在列表包含每个“类型”的 2 个元素时才有效。
      • @DeepSpace 你这是什么意思?
      • @qwertyayyy 你会得到错误的输出,例如lis = [(1,10, "n"), (1,15,"n1"), (1,20,"n1"), (2,20,"n"),(2,35,"n1"),(3,123,"n"),(3,12,"n1")]
      • @DeepSpace 谢谢你。这正是我想要代码做的事情。
      猜你喜欢
      • 1970-01-01
      • 2015-08-01
      • 2012-11-25
      • 2017-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-15
      相关资源
      最近更新 更多