用多个元素替换列表中的元素

时间:2018-11-17 22:46:37

标签: python python-3.x

我想用多个元素替换列表中的一个元素。例如,我有一个列表a = ['b', 'c'],并想用'b'替换'd', 'e',这将给我列表a = ['d', 'e', 'c']

我有以下代码:a = [??? if item == 'b' else item for item in a]。我该如何进行?我希望保持列表理解,例如,这似乎比a.extend(('b', 'c'))更合适。

5 个答案:

答案 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

有点长,但是我不知道是否有更好的插入方法。