【问题标题】:Python Remove SOME duplicates from a list while maintaining order?Python 在保持顺序的同时从列表中删除一些重复项?
【发布时间】:2012-07-21 07:26:19
【问题描述】:

我想删除我的 python 列表中的某些重复项。 我知道有一些方法可以删除所有重复项,但我只想删除连续的重复项,同时保持列表顺序。

例如,我有一个如下列表:

list1 = [a,a,b,b,c,c,f,f,d,d,e,e,f,f,g,g,c,c]

但是,我想删除重复项,并保持顺序,但仍保留 2 个 c 和 2 个 f,例如:

wantedList = [a,b,c,f,d,e,f,g,c]

到目前为止,我有这个:

z = 0
j=0
list2=[]
for i in list1:
    if i == "c":
        z = z+1
        if (z==1):
            list2.append(i)
        if (z==2):
            list2.append(i)
        else:
            pass
    elif i == "f":
        j = j+1
        if (j==1):
            list2.append(i)
        if (j==2):
            list2.append(i)
        else:
            pass
    else:
        if i not in list2:
            list2.append(i)  

但是,这种方法给了我类似的东西:

wantedList = [a,b,c,c,d,e,f,f,g]

因此,不维持秩序。

任何想法将不胜感激!谢谢!

【问题讨论】:

  • 您想删除连续个重复项是否准确?或者cf 有什么特别之处,以至于它们的处理方式与其他元素不同?

标签: python list set duplicates


【解决方案1】:

不完全确定 cf 是否是特殊情况,或者您是否只想压缩连续的重复项。如果是后者,可以使用itertools.groupby()

>>> import itertools
>>> list1
['a', 'a', 'b', 'b', 'c', 'c', 'f', 'f', 'd', 'd', 'e', 'e', 'f', 'f', 'g', 'g', 'c', 'c']
>>> [k for k, g in itertools.groupby(list1)]
['a', 'b', 'c', 'f', 'd', 'e', 'f', 'g', 'c']

【讨论】:

    【解决方案2】:

    要从列表中删除连续的重复项,可以使用以下生成器函数:

    def remove_consecutive_duplicates(a):
        last = None
        for x in a:
            if x != last:
                yield x
            last = x
    

    有了你的数据,这给出了:

    >>> list1 = ['a','a','b','b','c','c','f','f','d','d','e','e','f','f','g','g','c','c']
    >>> list(remove_consecutive_duplicates(list1))
    ['a', 'b', 'c', 'f', 'd', 'e', 'f', 'g', 'c']
    

    【讨论】:

      【解决方案3】:

      编辑 没关系,我读错了你的问题。我以为你只想保留某些双打。

      我会推荐这样的东西。它允许一般形式保留某些双精度数一次。

      list1 = ['a','a','b','b','c','c','f','f','d','d','e','e','f','f','g','g','c','c']
      doubleslist = ['c', 'f']
      
      def remove_duplicate(firstlist, doubles):
          newlist = []
          for x in firstlist:
              if x not in newlist:
                  newlist.append(x)
              elif x in doubles:
                  newlist.append(x)
                  doubles.remove(x)
          return newlist
      
      print remove_duplicate(list1, doubleslist)
      

      【讨论】:

        【解决方案4】:

        如果您想在删除重复项时忽略某些项目...

        list2 = []
        for item in list1:
            if item not in list2 or item in ('c','f'):
                list2.append(item)
        

        编辑:请注意,这不会删除连续的项目

        【讨论】:

        • 这似乎没有为样本输入 list1 提供所需的 wantedList 值。
        • 你是对的!他希望保留连续的 'f's 和 'c's... 问题需要更具体(我需要不那么仓促)
        【解决方案5】:

        简单的解决方案是将此元素与下一个或上一个元素进行比较

        a=1
        b=2
        c=3
        d=4
        e=5
        f=6
        g=7
        list1 = [a,a,b,b,c,c,f,f,d,d,e,e,f,f,g,g,c,c]
        output_list=[list1[0]]
        for ctr in range(1, len(list1)):
            if list1[ctr] != list1[ctr-1]:
                output_list.append(list1[ctr])
        print output_list
        

        【讨论】:

          【解决方案6】:
          list1 = ['a', 'a', 'b', 'b', 'c', 'c', 'f', 'f', 'd', 'd', 'e', 'e', 'f', 'f', 'g', 'g', 'c', 'c']
          
          wantedList = []
          
          for item in list1:   
             if len(wantedList) == 0:
                wantedList.append(item)
          
             elif len(wantedList) > 0:
                if  wantedList[-1] != item:
                    wantedList.append(item)
          
          print(wantedList)
          
          1. 从主列表 (list1) 中获取每个项目。
          2. 如果“temp_list”为空,则添加该项目。
          3. 如果不是,请检查 temp_list 中的最后一项是否为 与我们从“list1”中获取的项目不同。
          4. 如果项目不同,则追加到 temp_list。

          【讨论】:

            猜你喜欢
            • 2010-12-05
            • 1970-01-01
            • 2010-10-03
            • 1970-01-01
            • 2010-10-03
            • 2017-02-09
            相关资源
            最近更新 更多