Python 如何在不同长度的列表上使用map(),使用自定义值填充最短列表
我想使用map在多个列表上应用函数,并用自定义值填充最短列表。我已经使用for循环和zip_创建了一个解决方案,但我认为可以使用Python 如何在不同长度的列表上使用map(),使用自定义值填充最短列表,python,Python,我想使用map在多个列表上应用函数,并用自定义值填充最短列表。我已经使用for循环和zip_创建了一个解决方案,但我认为可以使用map()进行改进。我不知道哪个列表最长,它们可以有相同的长度。以下是我的实现: import itertools items1 = [1, 2, 3, 4] items2 = [1, 2] items3 = [1, 1, 1] def multiply(a, b, c): if a is None: a = 0.5 # custom va
map()
进行改进。我不知道哪个列表最长,它们可以有相同的长度。以下是我的实现:
import itertools
items1 = [1, 2, 3, 4]
items2 = [1, 2]
items3 = [1, 1, 1]
def multiply(a, b, c):
if a is None:
a = 0.5 # custom value, could also be set elsewhere
if b is None:
b = 0.4
if c is None:
c = 0.3
return a * b * c
squared_numbers = []
for numbers in itertools.zip_longest(items1, items2, items3):
squared_numbers.append(multiply(*numbers))
平方数的值
:
[1, 4, 1.2000000000000002, 0.48]
额外好处:我更喜欢通过def乘法设置自定义值(a=5,b=0.4,c=0.3),但我不确定这是否可行。也许你的意思是
itertools.starmap
而不是map
?下面是我想到的一些东西,但我不会说它比你已经写的更好:
from itertools import zip_longest, starmap
lists = [
[1, 2, 3, 4],
[1, 2],
[1, 1, 1]
]
def multiply(*args):
from functools import reduce
from operator import mul
defaults = [0.5, 0.4, 0.3]
return reduce(mul, (arg or default for arg, default in zip(args, defaults)))
squared_numbers = list(starmap(multiply, zip_longest(*lists)))
print(squared_numbers)
输出:
[1, 4, 1.2000000000000002, 0.48]
>>>
如果您使用的是itertools.zip_longest
,您就无法真正绕过使用fillvalue
——在我们的例子中,这意味着我们将始终向乘法传递三个参数,即使它们全部或部分是None
(itertools.zip_longest
的默认值fillvalue
)。这意味着您不能使用默认的位置参数,因为它们只有在传入的位置参数不足时才生效,这种情况永远不会发生
functools.reduce
中的生成器表达式通过短路计算工作。如果arg
为真,则表达式arg或default
将计算为arg
,否则为default
None
被认为是错误的,因此如果arg
是None
,则表达式的计算结果为default
,可能您的意思是itertools.starmap
而不是map
?下面是我想到的一些东西,但我不会说它比你已经写的更好:
from itertools import zip_longest, starmap
lists = [
[1, 2, 3, 4],
[1, 2],
[1, 1, 1]
]
def multiply(*args):
from functools import reduce
from operator import mul
defaults = [0.5, 0.4, 0.3]
return reduce(mul, (arg or default for arg, default in zip(args, defaults)))
squared_numbers = list(starmap(multiply, zip_longest(*lists)))
print(squared_numbers)
输出:
[1, 4, 1.2000000000000002, 0.48]
>>>
如果您使用的是itertools.zip_longest
,您就无法真正绕过使用fillvalue
——在我们的例子中,这意味着我们将始终向乘法传递三个参数,即使它们全部或部分是None
(itertools.zip_longest
的默认值fillvalue
)。这意味着您不能使用默认的位置参数,因为它们只有在传入的位置参数不足时才生效,这种情况永远不会发生
functools.reduce
中的生成器表达式通过短路计算工作。如果arg
为真,则表达式arg或default
将计算为arg
,否则为default
None
被认为是错误的,因此如果arg
是None
,则表达式的计算结果为default
我不确定我是否理解问题所在。代码有问题吗?这不是您预期的输出吗?@Tomerikoo代码运行良好,我很好奇代码是否可以进一步优化,然后您可能想问我不确定我是否理解问题所在。代码有问题吗?这不是您期望的输出吗?@Tomerikoo代码运行良好,我很好奇代码是否可以进一步优化,然后您可能想继续询问