我想用多个元素替换列表中的一个元素。例如,我有一个列表a = ['b', 'c']
,并想用'b'
替换'd', 'e'
,这将给我列表a = ['d', 'e', 'c']
。
我有以下代码:a = [??? if item == 'b' else item for item in a]
。我该如何进行?我希望保持列表理解,例如,这似乎比a.extend(('b', 'c'))
更合适。
答案 0 :(得分:3)
也许您可以创建一个二维列表,然后使用itertools.chain
对其进行展平:
from itertools import chain
a = ['b', 'c']
a = list(chain.from_iterable(['d', 'e'] if item == 'b' else [item] for item in a))
print(a)
# ['d', 'e', 'c']
答案 1 :(得分:3)
另一种选择是编写生成器函数:
def replace_item(the_list):
for item in the_list:
if item == 'b':
yield 'd'
yield 'e'
else:
yield item
>>> list(replace_item(['a', 'b']))
['a', 'd', 'e']
答案 2 :(得分:1)
您可以使用slice语法将多个元素替换为另一个元素:
a = 'a b c d b e'.split()
for i, item in list(enumerate(a))[::-1]: # makes and copy and reverse it (IMPORTANT!)
if item == 'b':
a[i:i+1] = ['d', 'e']
print(a)
['a','d','e','c','d','d','e','e']
反转部分是重要,因为每次替换都会使列表变长,当向后迭代时,索引应保持有效。
答案 3 :(得分:1)
另一种方法:
>>> v = ['b', 'c']
>>> v = [a for b in v for a in (['d', 'e'] if b == 'b' else [b])]
>>> v
['d', 'e', 'c']
您可以轻松地将其概括为多个替换项:
>>> v = ['b', 'c']
>>> rep = {'b': ['d', 'e']}
>>> v = [a for b in v for a in rep.get(b, [b])]
>>> v
['d', 'e', 'c']
答案 4 :(得分:0)
def insert_in_list(a, item_to_replace, list_to_insert):
try:
index = a.index(item_to_replace)
except ValueError: #if item is not in list
return a
a[index] = list_to_insert[0]
for i in list_to_insert[1:]:
a.insert(index + 1, i)
return a
有点长,但是我不知道是否有更好的插入方法。