我有一个列表: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))]
还有其他想法吗?
答案 0 :(得分:2)
您可以使用递归,(您可以使用True
和False
代替1
和0
,但这只是疯狂的谈话):
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.partial
和itertools.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]