Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中map()函数的多个迭代器?_Python_Iterator - Fatal编程技术网

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

python中map()函数的多个迭代器?,python,iterator,Python,Iterator,我知道有一种方法可以让pythonmap函数在一个命令中为多个迭代器执行,但我不断得到语法或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

我知道有一种方法可以让pythonmap函数在一个命令中为多个迭代器执行,但我不断得到语法或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
目标是将多个列表中的所有数字从字符串映射到整数,并映射到一个大列表中,然后使用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
使用多个迭代器映射: 考虑到所需的中间输出,我认为
map
不是获得包含整数1-9的
j
的正确工具

这是因为具有多个迭代器的
map
同时通过迭代器:

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

您的方法中存在的问题: 在第一次迭代中,它将返回
“1”、“4”、“7”
(每个iterable的第一个元素),下一次迭代将返回
“2”、“5”、“8”
,最后一次迭代将返回
“3”、“6”、“9”

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

int("1") and int("4") and int("7")
其计算结果为
7
,因为这是链接的
s的最后一个真实值:

>>> int("1") and int("4") and int("7")
7
这也解释了为什么结果是
24
,因为其他迭代的结果是
8
9

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

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

>>> "1" + "4" + "7"
"147"
>>> int("147")
147
解决方案: 因此,您需要从第二种方法中进行加法,但将
int
应用于每个变量,就像您在第一个示例中所做的那样:

j = list(map(lambda x, y, z: int(x)+int(y)+int(z), num, num2, num3))
更好的解决方案: 但是对于这个问题,我可能会使用不同的方法,特别是如果您想要“期望的”
j

要实现这一点,您需要了解iterables:

import itertools
chained = itertools.chain(num, num2, num3)
然后将它们全部转换为整数:

chained_integers = map(int, chained)
这个
chained_integers
是迭代器,相当于您想要作为
j
[1,2,3,4,5,6,7,8,9]
列表。如果要再次检查,还可以使用
chained_integers=list(map(int,chained))
并在继续之前打印
chained_integers

最后,为了减少it,我实际上会使用内置的sum函数:

reduced = sum(chained_integers)  # or "reduce(lambda x, y: x+y, chained_integers)"
def chain_as_ints(*iterables):
    for iterable in iterables:
        for item in iterable:
            yield int(item)
或单线版本:

sum(map(int, itertools.chain(num, num2, num3)))
使用理解而不是映射的替代解决方案: 更简单的是理解(在本例中,我使用了生成器表达式),而不是
映射

reduced = sum(int(v) for v in itertools.chain(num, num2, num3))
使用生成器函数的替代解决方案: 这很简短,也很容易理解,但我想举另一个例子,说明如何使用自己的生成器函数来实现这一点:

reduced = sum(chained_integers)  # or "reduce(lambda x, y: x+y, chained_integers)"
def chain_as_ints(*iterables):
    for iterable in iterables:
        for item in iterable:
            yield int(item)
你可以这样使用它:

sum(chain_as_ints(num, num2, num3))

在这种情况下,生成器函数实际上是不必要的(考虑到备选方案,可能并不可取),为了完整起见,我只想提及它。

因为您希望将每个列表的元素作为一个长列表进行迭代,所以最简单的方法是将它们串联起来:

nums = map(int, num + num2 + num3)

你会犯什么错误?