2017-01-06 5 views
2

を返さないことを確認どのように他の単語にこれが、私は次のシーケンスを含むリストを持っていると言う:リストから半固有の値

[a,a,a,b,b,b,a,a,a] 

と私は返すしたいと思います:

[a,b,a] 

これは原則どのように行いますか?

+0

M aybe "リストの重複要素を折りたたむ/圧縮する"? –

+0

有益な提案ありがとうございました。 非常に高く評価されています。 – Luke

答えて

4

あなたは、itertools.groupbyを使用することができ、同じグループ内で、このグループの連続した同じ要素とキーは、あなたが探しているユニークな要素であるキーと値のペアのイテレータを返す:

from itertools import groupby 

[k for k, _ in groupby(lst)] 
# ['a', 'b', 'a'] 

lst = ['a','a','a','b','b','b','a','a','a'] 
2

Psidomsの方がはるかに優れていますが、これも書いて、基本的なループやステートメントを使うだけでどのように使えるのか分かります。それは通常、少し簡単に物事をシンプルにコーディング作るように、それは、あなたがどんな問題のために取る必要があると思い手順かを把握することは常に良いことだ:)

original = ['a','a','a','b','b','b','a','a','a'] 
new = [original[0]] 

for letter in original[1:]: 
    if letter != new[-1]: 
     new.append(letter) 

前の文字が何かあれば基本的には、文字を追加します異なる。

import more_itertools as mit 

list(mit.unique_justseen(["a","a","a","b","b","b","a","a","a"])) 
# ['a', 'b', 'a'] 
1

使用してリスト内包:

は同様
original = ['a','a','a','b','b','b','a','a','a'] 
packed = [original[i] for i in range(len(original)) if i == 0 or original[i] != original[i-1]] 
print(packed) # > ['a', 'b', 'a'] 

(おかげでpylangする)あなたはrangeの代わりにenumerateを使用することができます。

[ x for i,x in enumerate(original) if i == 0 or x != original[i-1] ] 
+0

代わりに 'for i、_ in enumerate(lst)'はどうですか? – pylang

+1

さらに、i == 0またはx!= lst [i-1]]なら '[lst [i] for i、xは列挙する(lst) –

関連する問題