嗨朋友们我想进行一项操作我相信我可以用地图来解决这个问题。
以下操作实际上正常工作。但我想做一些不同的事情。
当它增加时,18岁将是19岁。但是当下一个值到来时,现在将收集19。在这个例子中,我想要的输出是:
>> [18,18,18,19,19,21]
这就是我能做的:
def sum(x):
return x+18
new_list = list(map(sum, [0,0,0,1,0,2]))
>> [18, 18, 18, 19, 18, 20]
答案 0 :(得分:1)
尝试用map
做你想做的事情,需要在函数中加入某种“记忆” - 它必须知道它到目前为止做了什么,所以它知道下一步该做什么。
你可以通过使用闭包或使用带有__call__
方法的类来执行此操作。但是有一种更简单的方法。
您正在寻找的几乎就是accumulate
功能。唯一的区别是你想提供一个起始值。 (当然,accumulate
实际上并不在2.7中的stdlib中;你需要将它从PyPI上的backport中删除。)
您可以通过三种显而易见的方式解决这个问题:
accumulate
,然后将您的起始值添加到每个元素。chain
输入前的起始值,然后accumulate
,然后next
(或islice
)跳过输出中的额外值。accumulate
文档中获取“大致相同”的示例代码,然后修改它以获取起始值。让我们做最后一个 - 它可能是最重的选项,但是你可以从中学到最多的选项,加上它甚至可以在没有任何后退的情况下工作:
def accumulate(iterable, func=operator.add, start=0):
'Return running totals'
it = iter(iterable)
total = start
try:
total += next(it)
except StopIteration:
return total
yield total
for element in it:
total = func(total, element)
yield total
与docs中的原始代码相比 - 我所做的就是添加一个新参数,设置total = start
,并更改第一个元素或空迭代的特殊处理。你显然可以简化一些事情(如果我们有一个起始值,我们甚至不需要需要对空输入进行特殊处理),或者让事情变得更加漂亮(默认为没有起始值而不是0,所以{{ 1}}适用于不能与int互操作的类型,就像accumulate
中那样,等等),但这是一个简单的起点。
现在:
itertools
答案 1 :(得分:1)
如何使用2.7中存在 的reduce
函数? reduce
通常与map
结合使用,可在经过一定数量的地图转换后汇总列表。
这是我的3.5版本,它应该接近,如果与2.7不相同:
startVal = 18
myList = [0,0,0,1,0,2]
accumulator = reduce((lambda x, y: ( x + [y + (0 if len(x) == 0 else x[-1])])), myList, [])
[startVal + v for v in accumulator]
>> [18, 18, 18, 19, 19, 21]
我利用添加的列表(连接)将后续值附加到初始化程序中定义的空列表中。由于您无法获得空列表的最后一个条目,因此有一点条件。