リスト要素の連続する重複を排除する と、それをPythonでどのように実装する必要があるかについて、私は好奇心を持っていました。
私が思いついたのはこれです:
list = [1,1,1,1,1,1,2,3,4,4,5,1,2]
i = 0
while i < len(list)-1:
if list[i] == list[i+1]:
del list[i]
else:
i = i+1
出力:
[1, 2, 3, 4, 5, 1, 2]
大丈夫だと思います。
だから私は気になったので、連続して重複しているelementsを削除してこの出力を取得できるかどうかを確認したいと思いました。
[2, 3, 5, 1, 2]
そのために私はこれをしました:
list = [1,1,1,1,1,1,2,3,4,4,5,1,2]
i = 0
dupe = False
while i < len(list)-1:
if list[i] == list[i+1]:
del list[i]
dupe = True
Elif dupe:
del list[i]
dupe = False
else:
i += 1
しかし、それは一種の不器用でPythonicではないようですが、これを実装するためのよりスマート/よりエレガント/より効率的な方法はありますか?
>>> L = [1,1,1,1,1,1,2,3,4,4,5,1,2]
>>> from itertools import groupby
>>> [x[0] for x in groupby(L)]
[1, 2, 3, 4, 5, 1, 2]
必要に応じて、リスト内包表記の代わりにマップを使用できます
>>> from operator import itemgetter
>>> map(itemgetter(0), groupby(L))
[1, 2, 3, 4, 5, 1, 2]
後編
>>> [x for x, y in groupby(L) if len(list(y)) < 2]
[2, 3, 5, 1, 2]
長さを取るためだけに一時リストを作成したくない場合は、ジェネレーター式に対してsumを使用できます
>>> [x for x, y in groupby(L) if sum(1 for i in y) < 2]
[2, 3, 5, 1, 2]
純粋なPythonのOneliner
[v for i, v in enumerate(your_list) if i == 0 or v != your_list[i-1]]
以下は、外部パッケージに依存しないソリューションです。
list = [1,1,1,1,1,1,2,3,4,4,5,1,2]
L = list + [999] # append a unique dummy element to properly handle -1 index
[l for i, l in enumerate(L) if l != L[i - 1]][:-1] # drop the dummy element
次に、Ulf Aslakの同様のソリューションがよりクリーンであることに気付きました:)
functools.reduce
(インポートを除く)を使用した、もう1つの可能な1行-その欠点として、文字列とリストには若干異なる実装が必要です。
>>> from functools import reduce
>>> reduce(lambda a, b: a if a[-1:] == [b] else a + [b], [1,1,2,3,4,4,5,1,2], [])
[1, 2, 3, 4, 5, 1, 2]
>>> reduce(lambda a, b: a if a[-1:] == b else a+b, 'aa bbb cc')
'a b c'
Toリスト要素の連続する重複を削除します;別の方法として、 itertools.izip_longest()
とlist comprehensionを次のように使用できます。
>>> from itertools import izip_longest
>>> my_list = [1,1,1,1,1,1,2,3,4,4,5,1,2]
>>> [i for i, j in izip_longest(my_list, my_list[1:]) if i!=j]
[1, 2, 3, 4, 5, 1, 2]