用一个列表中的两个或多个替换一个项目的pythonic方法

时间:2013-08-28 21:35:10

标签: python

如何以编程方式将两个或更多列表中的一个项目替换?我正在使用狭缝和索引,它看起来非常蟒蛇。

我希望这样的事情存在:

values = [ "a", "b", "old", "c" ]
[ yield ["new1", "new2"] if item == "old" else item for item in values ]
// return [ "a", "b", "new1", "new2", "c" ]

4 个答案:

答案 0 :(得分:12)

执行此操作的最佳方法是使用itertools.chain.from_iterable

itertools.chain.from_iterable(
  ("new1", "new2") if item == "old" else (item, ) for item in values)

通过制作嵌套列表然后将其展开来解决您遇到的“每个项目多个项目”问题。通过制作所有项目元组(单项元组,我们只想要一个),我们可以实现这一点。

当然,如果您需要一个列表而不是迭代器,请通过调用list()来包装整个事件。

答案 1 :(得分:2)

我认为你有正确的想法。但是,列表推导并不总是很合适。

以下是使用列表连接的解决方案:

values = [ 'a', 'b', 'old', 'c' ]

def sub1(values, old, new):
    newvalues = []
    for item in values:
        if item == old:
            newvalues += new
        else:
            newvalues += [item]
    return newvalues

print sub1(values, 'old', ['new1', 'new2'])

这里有一个使用发电机:

def sub2(values, old, new):
    for item in values:
        if item == old:
            for i in new:
                yield i
        else:
            yield item

for i in sub2(values, 'old', ['new1', 'new2']):
    print i

答案 2 :(得分:1)

这是OP here所要求的多个值的一般*解决方案:

subs = {'old':("new1", "new2"), 'cabbage':('ham','and','eggs')}
itertools.chain.from_iterable(
  subs[item] if item in subs else (item, ) for item in values)

使用基于追加的方法不会变得更容易或更难:

def sub1(values, subs):
    newvalues = []
    for item in values:
        if item in subs:
            newvalues += subs[item]
        else:
            newvalues += [item]
    return newvalues

*如果您的旧项目不可用,那么这将不起作用,您需要使它们可以清洗或找出另一个数据结构。你还会比编写平等测试更喜欢它。

答案 3 :(得分:-1)

行。功能更多,但我不确定它真的更像'Pythonic':

reduce(operator.add, [ [x] if x != 'old' else ['new1','new2']  for x in values ] )

真的和另一个答案一样,除了reduce而不是itertools。

Reduce是一种标准的函数式编程习惯,所以它的作用应该更加明显。

itertools.chain.from_iterable很酷,但有点晦涩难懂。