3

我想删除我的 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]

因此,不维持秩序。

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

4

6 回答 6

8

不完全确定是否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']
于 2012-07-23T03:47:43.807 回答
3

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

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']
于 2012-07-23T03:36:29.990 回答
0

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

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

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

于 2012-07-23T03:37:39.893 回答
0

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

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

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)
于 2012-07-23T03:40:09.410 回答
0

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

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
于 2012-07-23T04:54:12.063 回答
0
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。
于 2017-02-18T15:39:38.407 回答