用两项替换列表中的一项

Posted

技术标签:

【中文标题】用两项替换列表中的一项【英文标题】:Replacing one item in a list with two items 【发布时间】:2014-04-14 02:18:34 【问题描述】:

用两个替换列表中的一个项目的最简单方法是什么?

所以:

list=['t' , 'r', 'g', 'h', 'k']

如果我想用“a”和“b”替换“r”:

list = ['t' , 'a' , 'b', 'g', 'h', 'k']

【问题讨论】:

【参考方案1】:

通过切片分配可以相当容易地完成:

>>> l = ['t' , 'r', 'g', 'h', 'k']
>>> 
>>> pos = l.index('r')
>>> l[pos:pos+1] = ('a', 'b')
>>> 
>>> l
['t', 'a', 'b', 'g', 'h', 'k']

另外,不要调用您的变量list,因为该名称已被内置函数使用。

【讨论】:

【参考方案2】:

如果列表包含超过 1 次出现的 'r',那么您可以使用列表推导式或带有生成器表达式的 itertools.chain.from_iterable。但是,如果列表仅包含一个这样的项目,那么对于 @arshajii 的解决方案。

>>> lis = ['t' , 'r', 'g', 'h', 'k']
>>> [y for x in lis for y in ([x] if x != 'r' else ['a', 'b'])]
['t', 'a', 'b', 'g', 'h', 'k']

或:

>>> from itertools import chain
>>> list(chain.from_iterable([x] if x != 'r' else ['a', 'b'] for x in lis))
['t', 'a', 'b', 'g', 'h', 'k']

【讨论】:

我认为这里的重点是拼接'r'所有 次出现,但是如果(如在 OP 的示例中)只有一次出现,这对于简单拼接。 @kojiro 可能是我没有正确阅读这个问题,因为只有一次,这当然是矫枉过正。【参考方案3】:

这是一种过于复杂的方法,它会拼接每次出现的“r”。只是为了好玩。

>>> l = ['t', 'r', 'g', 'h', 'r', 'k', 'r']
>>> reduce(lambda p,v: p + list('ab' if v=='r' else v), l, [])
['t', 'a', 'b', 'g', 'h', 'a', 'b', 'k', 'a', 'b']

现在去投票一个更易读的答案。 :)

【讨论】:

以上是关于用两项替换列表中的一项的主要内容,如果未能解决你的问题,请参考以下文章

插入排序的JavaScript实现

从多个链接获取数据,同时存储在 Scrapy 中的一项中

如何在 RecyclerView 的一项中找到两个文本块?

如何在由前一个元素的连续值和第二项中的零组成的列表中添加连续元素?

用表达式中的一项替换花括号表达式

如何用包含空格的字符串替换列表中的项目?