以所有可能的方式增加每个列表元素

时间:2011-09-01 15:30:55

标签: python list

我有一个列表:test = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]

需要使用 Python标准库以所有可能的方式增加每个列表元素。这是一项测试任务,我已经这样做了:

test = [elem + 1 for elem in test]

for i in range(len(test)): test[i] += 1

test = map(lambda x : x + 1, test)

test = [sum(elem) for elem in zip(test, [1]*len(test))]

还有其他想法吗?

3 个答案:

答案 0 :(得分:2)

您可以使用递归,(您可以使用TrueFalse代替10,但这只是疯狂的谈话):

def recurseadd(test):
    if test:
        return [test[False] + True] + recurseadd(test[True:])
    else:
        return test

而不是+,您可以使用[test[0] + 1].extend(recurseadd(test[1:]))

如果您愿意,可以使用operator.add代替+functools.partialitertools.imap

from functools import partial
from operator import add
from itertools import imap

addone = partial(add, 1)

test = list(imap(addone, test))  # don't really use imap if you want a list

您可以使用itertools的{​​{1}}和izip

repeat

另一种test = [sum(elem) for elem in izip(test, repeat(1))] 的方法,受到Eren对GWW答案的评论的启发:

sum

您可以使用test = sum(([x+1] for x in test), []) 代替xrange,您可以使用range生成itertools.count(1).next() s ...

有无数的微小变化,但你的三个加上递归版本似乎涵盖了基本版本。 Eren的降版也很不错。

答案 1 :(得分:1)

In [23]: import operator

In [24]: import itertools

In [25]: list(itertools.starmap(operator.add,zip(test,itertools.repeat(1))))
Out[25]: [2, 3, 4, 5, 6, 7, 8, 9, 10, 1]

In [26]: list(itertools.imap(operator.add,test,itertools.repeat(1)))
Out[26]: [2, 3, 4, 5, 6, 7, 8, 9, 10, 1]

In [30]: list(itertools.starmap(operator.add,itertools.izip_longest(test,[],fillvalue=1)))
Out[30]: [2, 3, 4, 5, 6, 7, 8, 9, 10, 1]

答案 2 :(得分:0)

我想到了两个使用pythons reduce函数,但是,它们与你已经完成的相似。

>>> [reduce(lambda x,y: x + y, l) for l in zip(li, [1]*len(li))]
[2, 3, 4, 5, 6, 7, 8, 9, 10, 1]
>>> [reduce(lambda x,y: x + y, (z,1)) for z in li]
[2, 3, 4, 5, 6, 7, 8, 9, 10, 1]