python中map()函数的多个迭代器?

Bor*_*s P 2 python iterator

我知道有一种方法可以在一个命令中为多个迭代器执行 python map 函数,但我不断收到语法或 valueErrors,或者如果它确实编译它只是覆盖以前的迭代或给出错误的答案。我究竟做错了什么?

num = ["1","2","3"]
num2 =["4","5","6"]
num3 = ["7","8","9"]

j = list(map(lambda x, y, z: int(x) and int(y) and int(z), num, num2, num3))
print(j)   #[7, 8, 9]
print(reduce(lambda x, y: x+y, j))   #24
Run Code Online (Sandbox Code Playgroud)

目标是将多个列表中的所有数字从字符串映射到整数到一个大列表中,然后使用 reduce() 求和

j 应该出来 [1,2,3,4,5,6,7,8,9] 所有整数

减少应将其总和为 45

更新:这种方式也不起作用

num = ["1","2","3"]
num2 =["4","5","6"]
num3 = ["7","8","9"]

j = list(map(lambda x, y, z: int(x+y+z), num, num2, num3))
print(j)  #[147, 258, 369]
print(reduce(lambda x, y: x+y, j)) #774
Run Code Online (Sandbox Code Playgroud)

MSe*_*ert 5

使用多个迭代器映射:

鉴于您想要的中间输出,我会说这map不是获取j包含整数 1-9的正确工具。

那是因为map多个迭代器同时通过迭代器:

在此处输入图片说明

它不重复,那只是因为它是一个 gif 文件。

您的方法中的问题:

在第一次迭代中它将返回"1", "4", "7"(每个迭代的第一个元素)下一次迭代将返回"2", "5", "8"和最后一次迭代"3", "6", "9"

在这些返回中的每一个上,它将应用该函数,在第一次迭代的第一个示例中

int("1") and int("4") and int("7")
Run Code Online (Sandbox Code Playgroud)

其评估为7因为这是链式ands的最后一个真值:

>>> int("1") and int("4") and int("7")
7
Run Code Online (Sandbox Code Playgroud)

这也解释了为什么结果是24因为其他迭代的结果是89

>>> int("2") and int("5") and int("8")
8
>>> int("3") and int("6") and int("9")
9

>>> 7 + 8 + 9
24
Run Code Online (Sandbox Code Playgroud)

在您的第二个示例中,您添加了字符串(连接字符串),然后将其转换为整数:

>>> "1" + "4" + "7"
"147"
>>> int("147")
147
Run Code Online (Sandbox Code Playgroud)

解决方案:

因此,您需要从第二种方法中添加,但int像在第一个示例中一样将 应用于每个变量:

j = list(map(lambda x, y, z: int(x)+int(y)+int(z), num, num2, num3))
Run Code Online (Sandbox Code Playgroud)

更好的解决方案:

但是对于那个问题,我可能会使用不同的方法,特别是如果您想要“desired” j.

为了得到它,你需要chain迭代:

import itertools
chained = itertools.chain(num, num2, num3)
Run Code Online (Sandbox Code Playgroud)

然后将它们全部转换为整数:

chained_integers = map(int, chained)
Run Code Online (Sandbox Code Playgroud)

chained_integers是迭代器等效于[1, 2, 3, 4, 5, 6, 7, 8, 9]您想要的列表j。如果您想仔细检查,您也可以在继续之前使用chained_integers = list(map(int, chained))和打印chained_integers

最后,reduce我实际上会使用内置sum函数:

reduced = sum(chained_integers)  # or "reduce(lambda x, y: x+y, chained_integers)"
Run Code Online (Sandbox Code Playgroud)

或单行版本:

sum(map(int, itertools.chain(num, num2, num3)))
Run Code Online (Sandbox Code Playgroud)

使用理解而不是的替代解决方案map

更简单的是理解(在这种情况下我使用了生成器表达式)而不是map

reduced = sum(int(v) for v in itertools.chain(num, num2, num3))
Run Code Online (Sandbox Code Playgroud)

使用生成器函数的替代解决方案:

这非常简短且易于理解,但我想展示另一个示例,说明如何使用您自己的生成器函数来做到这一点:

def chain_as_ints(*iterables):
    for iterable in iterables:
        for item in iterable:
            yield int(item)
Run Code Online (Sandbox Code Playgroud)

你可以像这样使用它:

sum(chain_as_ints(num, num2, num3))
Run Code Online (Sandbox Code Playgroud)

在这种情况下,生成器函数并不是真正必要的(考虑到替代方案,可能也不可取)我只是想提一下它的完整性。