Python在维护订单的同时从列表中删除一些重复项?

时间:2012-07-23 03:26:38

标签: python list set duplicates

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

因此,不维持秩序。

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

6 个答案:

答案 0 :(得分: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']

答案 1 :(得分: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']

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

EDIT 没关系,我读错了你的问题。我以为你只想保留一定数量的双打。

我会推荐这样的东西。它允许一般形式保持一定的双倍。

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 :(得分: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

答案 5 :(得分: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。