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

編集気にしないでください、私はあなたの質問を間違って読みました。私はあなたがダブルスの特定のセットだけを保持したいと思っていたと思いました。

私はこのようなものをお勧めします。これにより、一般的なフォームで特定のdoubleを1回保持できます。

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

重複を削除するときに特定のアイテムを無視したい場合...

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

簡単な解決策は、この要素を次または前の要素と比較することです

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 に答える