2013-12-10 2 views
10

Was den pythonic Weg ist b ersetzt es durch die gegebene Liste ['a', 'b', 'c'] für das Element zu suchen und mehr Artikel b1, b2, b3 so einsetzen, dass die Liste liest schließlich als ['a', 'b1', 'b2', 'b3', 'c']Suche nach Elemente in der Liste und ersetzen Sie es durch mehrere Artikel

+1

Was soll passieren, wenn 'b' vorhanden ist, mehr als einmal? –

+0

in meinem speziellen Fall ist es garantiert, dass die Elemente eindeutig sind – greole

Antwort

14

Verwendung Slice-Notation:

>>> lst = ['a', 'b', 'c'] 
>>> i = lst.index('b') # This raises ValueError if there's no 'b' in the list. 
>>> lst[i:i+1] = 'b1', 'b2', 'b3' 
>>> lst 
['a', 'b1', 'b2', 'b3', 'c'] 

HINWEIS Dies ändert sich nur das erste passende Element.

+0

@SteveP., Siehe [* Listen * Abschnitt aus Python-Tutorial] (http://docs.python.org/3/tutorial/introduction.html#lists). – falsetru

+0

@SteveP., Weil die 'list .__ setitem__ mit slice-Objektargument' auf diese Weise implementiert ist. Siehe http://hg.python.org/cpython/file/a3bdbe220f8a/Objects/listobject.c#l579 – falsetru

+0

Danke, das habe ich gesucht. –

3

Alternative Ansatz: Mit itertools.chain.from_iterable

>>> b = ["b1", "b2", "b3"] 
>>> a = ['a', 'b', 'c'] 
>>> a = [b if x=='b' else [x] for x in a] 
>>> a 
['a', ['b1', 'b2', 'b3'], 'c'] 
>>> import itertools 
>>> list(itertools.chain.from_iterable(a)) 
['a', 'b1', 'b2', 'b3', 'c'] 
>>> 
+3

Um einen allgemeinen Fall zu unterstützen, müssen einzelne Elemente iterierbar gemacht werden: '... else [x] für x in a'. – georg

+1

Probieren Sie 'a = ['aaa', 'b', 'ccc']', und Sie werden sehen, warum @ thg435 "[x]" vorschlagen. (Übrigens, String-Objekte sind iterierbar.) – falsetru

Verwandte Themen