【问题标题】:python compare elements in alist of tuples with the same indexpython比较具有相同索引的元组列表中的元素
【发布时间】:2017-07-14 00:13:58
【问题描述】:

我有一个元组列表:

list = [(u'RHSA-2017:1270', u'Red Hat Enterprise Linux 6'), (u'RHSA-2017:1271', u'Red Hat Enterprise Linux 6'), (u'RHSA-2017:1270', u'Red Hat Enterprise Linux 7')]

我需要比较每个元组的 index1 元素,即

'Red Hat Enterprise Linux 6'

前两个元组相同

以及元组3中的第一个索引元素,即:

'Red Hat Enterprise Linux 7'

我的目标是一旦我检测到元组 2 中的元素索引 1 是重复的

从列表中删除这个元组。

我已经尝试使用所需的元组创建一个新列表,因为我得到了

一个空列表

new_list = []
for i in list:
    rhel_ver = str(i[1])
    if rhel_ver not in i:
         new_list.append(i)

得到空列表。我怎样才能只得到第一个包含的元组 rhel 版本,即:

list = [(u'RHSA-2017:1270', u'Red Hat Enterprise Linux 6'), (u'RHSA-2017:1270', u'Red Hat Enterprise Linux 7')]

【问题讨论】:

    标签: python


    【解决方案1】:

    您可以使用内置的any 创建一个新的唯一列表:

    my_list = [(u'RHSA-2017:1270', u'Red Hat Enterprise Linux 6'), (u'RHSA-2017:1271', u'Red Hat Enterprise Linux 6'),
               (u'RHSA-2017:1270', u'Red Hat Enterprise Linux 7')]
    
    unique_list = []
    for element in my_list:
        if not any(tup[1] == element[1] for tup in unique_list):
            unique_list.append(element)
    
    print(unique_list)
    

    【讨论】:

      【解决方案2】:

      您可以跟踪您在set 中看到的元素:

      lst = [(u'RHSA-2017:1270', u'Red Hat Enterprise Linux 6'), 
             (u'RHSA-2017:1271', u'Red Hat Enterprise Linux 6'), 
             (u'RHSA-2017:1270', u'Red Hat Enterprise Linux 7')]
      seen = set()
      result = []
      for rhsa, name in lst:
          if name not in seen:
              result.append((rhsa, name))
              seen.add(name)
      print(result)
      # [('RHSA-2017:1270', 'Red Hat Enterprise Linux 6'), ('RHSA-2017:1270', 'Red Hat Enterprise Linux 7')]
      

      【讨论】:

        【解决方案3】:

        您可以使用 python OrderedDict 创建一个新列表,将索引 1(元组中的第二个元素)设置为键。这将删除任何重复项。然后,您可以从 Ordered Dict 生成一个新列表。蟒蛇2.7

        import collections
        tagPairs=collections.OrderedDict()
        
        lst = [(u'RHSA-2017:1270', u'Red Hat Enterprise Linux 6'), 
               (u'RHSA-2017:1271', u'Red Hat Enterprise Linux 6'), 
               (u'RHSA-2017:1270', u'Red Hat Enterprise Linux 7')]
        for i,v in lst:
            tagPairs[v]=i
        unique_list=[]
        for k,j in tagPairs.items():
            unique_list.append((j,k))
        print unique_list
        

        【讨论】:

        • 我认为 OP 希望为任何唯一键保留第一个元素,但您可以使用 for i,v in reversed(lst) 解决此问题。此外,最后一部分可以通过列表理解来缩短(或者只做tagPairs[v] = (i,v) 然后unique_list = list(tagPairs.items())
        猜你喜欢
        • 2021-06-25
        • 1970-01-01
        • 1970-01-01
        • 2015-08-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-27
        • 1970-01-01
        • 2017-05-14
        相关资源
        最近更新 更多