Python 如何在不同长度的列表上使用map(),使用自定义值填充最短列表

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在多个列表上应用函数,并用自定义值填充最短列表。我已经使用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 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代码运行良好,我很好奇代码是否可以进一步优化,然后您可能想继续询问