2017-01-06 3 views
2

Nicht sicher, wie sonst zu Wort dieses, aber ich habe eine Liste haben die folgende Sequenz enthält:Rückkehr halb eindeutige Werte aus einer Liste

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

und ich möchte zurückkehren:

[a,b,a] 

Wie würde man das prinzipiell machen?

+0

M aybe "Verdopple/komprimiere doppelte Elemente in einer Liste"? –

+0

Danke für die nützlichen Vorschläge alle :). Sehr geschätzt. – Luke

Antwort

4

Sie itertools.groupby verwenden können, diese Gruppen aufeinander folgende gleiche Elemente in der gleichen Gruppe und das Rück einen Iterator von Schlüssel-Wert-Paaren, wo der Schlüssel des einzigartige Element ist, die Sie suchen:

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 Weg ist viel besser, aber ich kann genauso gut schreiben, damit Sie sehen können, wie es möglich wäre, nur einfache Schleifen und Anweisungen zu verwenden. Es ist immer gut, um herauszufinden, welche Schritte Sie für jedes Problem nehmen müssten, da es macht in der Regel die einfachen Dinge Codierung ein bisschen einfacher :)

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) 

Grundsätzlich wird es einen Brief anhängen, wenn der vorhergehende Brief etwas anders.

1

Mit Liste Verständnis:

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'] 

Ähnlich (dank pylang) Sie enumerate statt range verwenden können:

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

Wie wäre es mit 'für i, _ in enumerate (lst)' stattdessen? – pylang

+1

Noch besser: "[lst [i] für i, x in enumerate (lst), wenn i == 0 oder x! = Lst [i-1]]" –

Verwandte Themen