2013-12-10 3 views
10

Что такое вещий способ поиска с помощью данного списка ['a', 'b', 'c'] для элемента b заменить его и вставить несколько элементов b1, b2, b3 так что список наконец гласит ['a', 'b1', 'b2', 'b3', 'c']поиск элемента в списке и заменить его на несколько элементов

+1

Что должно произойти, если 'b' присутствует более чем один раз? –

+0

в моем конкретном случае гарантирует, что элементы уникальны. – greole

ответ

14

Использование ломтика обозначения:

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

ПРИМЕЧАНИЕ Это изменяет только первый элемент согласования.

+0

@SteveP., См. Раздел [* Списки * из учебника Python] (http://docs.python.org/3/tutorial/introduction.html#lists). – falsetru

+0

@SteveP., Потому что этот метод «list .__ setitem__ с аргументом объекта среза» реализован. См. Http://hg.python.org/cpython/file/a3bdbe220f8a/Objects/listobject.c#l579 – falsetru

+0

Спасибо, вот что я искал. –

3

Альтернативный подход: Использование 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

Для поддержки общего случая отдельные элементы должны быть сделаны итерабельными: '... else [x] для x в a'. – georg

+1

Попробуйте 'a = ['aaa', 'b', 'ccc']', и вы увидите, почему @ thg435 предлагает '[x]'. (BTW, строковые объекты итерабельны.) – falsetru

Смежные вопросы