【问题标题】:How can i Remove consecutive duplicate tuples from a list of tuples?如何从元组列表中删除连续重复的元组?
【发布时间】:2017-05-23 18:05:58
【问题描述】:

我有一个名为 lt 的元组列表。

lt = [ (1,2) , (1,2) , (2,3) , (3,4) , (5,6) , (7,8) , (7,8) ] 

我想从列表中删除所有连续的重复元组。结果应该是这样的。

mainList = [(1, 2), (2, 3), (3, 4), (5, 6), (7, 8)]

【问题讨论】:

    标签: python list python-3.x tuples


    【解决方案1】:

    使用pairwise() function from the itertools reception section

    from itertools import tee
    
    def pairwise(iterable):
        "s -> (s0,s1), (s1,s2), (s2, s3), ..."
        a, b = tee(iterable)
        next(b, None)
        return zip(a, b)
    
    mainList = [curr for curr, next in pairwise(lt) if curr != next]
    

    这将为您提供一个新列表,其中删除了所有连续的元组。您还可以将itertools.groupby() function 与默认身份密钥一起使用:

    from itertools import groupby
    
    mainList = [k for k, g in groupby(lt)]
    

    演示:

    >>> from itertools import tee, groupby
    >>> lt = [ (1,2) , (1,2) , (2,3) , (3,4) , (5,6) , (7,8) , (7,8) ]
    >>> def pairwise(iterable):
    ...     "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    ...     a, b = tee(iterable)
    ...     next(b, None)
    ...     return zip(a, b)
    ...
    >>> [curr for curr, next in pairwise(lt) if curr != next]
    [(1, 2), (2, 3), (3, 4), (5, 6)]
    >>> [k for k, g in groupby(lt)]
    [(1, 2), (2, 3), (3, 4), (5, 6), (7, 8)]
    

    【讨论】:

      【解决方案2】:
      lt = [ (1,2) , (1,2) , (2,3) , (3,4) , (5,6) , (7,8) , (7,8) ] 
      
      mainList = []
      
      for t in lt:
        if len(mainList) == 0:
          mainList.append(t)
        else:
          if mainList[-1] != t:
            mainList.append(t)
      
      print(mainList) 
      

      结果

      [(1, 2), (2, 3), (3, 4), (5, 6), (7, 8)]
      

      【讨论】:

        【解决方案3】:

        复杂的列表理解怎么样?

        [v for i, v in enumerate(lt) if i == o or v != lt[i-1]]
        

        【讨论】:

          【解决方案4】:

          您可以尝试创建一个新列表,并将元素添加到该列表中。如果一个元素已经在新列表中,不要添加它。

          lt = [ (1,2) , (1,2) , (2,3) , (3,4) , (5,6) , (7,8) , (7,8) ] 
          newlt = [lt[0]]
          for item in range(len(lt)):
              if item == 0:
                  continue
              elif lt[item] == lt[item - 1]:
                  continue
              else:
                  newlt.append(lt[item])
          print(newlt)
          
          [(1, 2), (2, 3), (3, 4), (5, 6), (7, 8)]
          

          编辑:新的解决方案,这应该工作。这显然是非常基本的。

          【讨论】:

          • 很好的尝试,但您的代码会产生不准确的结果。使用此列表尝试您的代码。 lt = [ (1,2) , (1,2) , (2,3) , (3,4) , (5,6) , (7,8) , (7,8) ,(1,2) ] . index0 和 1 是连续重复的,但最后一个元素不是。您的代码也会删除最后一个。
          猜你喜欢
          • 1970-01-01
          • 2018-12-25
          • 2018-10-17
          • 2020-05-31
          • 1970-01-01
          • 2019-06-12
          • 1970-01-01
          • 1970-01-01
          • 2019-02-01
          相关资源
          最近更新 更多