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

时间:2018-01-14 21:00:52

标签: 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

目标是将多个列表中的所有数字从字符串映射到整数到一个大列表中,然后使用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

2 个答案:

答案 0 :(得分:3)

使用多个迭代器映射:

考虑到你想要的中间输出,我会说map不是获得包含整数1-9的j的正确工具。

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

enter image description here

它没有重复,这只是因为它是一个gif文件。

您方法中的问题:

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

在每个返回时,它将应用该函数,在第一个迭代中的第一个例子中

int("1") and int("4") and int("7")

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

>>> int("1") and int("4") and int("7")
7

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

>>> 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

为此,你需要chain迭代:

import itertools
chained = itertools.chain(num, num2, num3)

然后将所有这些转换为整数:

chained_integers = map(int, chained)

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)"

或单行版本:

sum(map(int, itertools.chain(num, num2, num3)))

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

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

reduced = sum(int(v) for v in itertools.chain(num, num2, num3))

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

这很简短易懂,但我想提供一个如何使用自己的生成器函数来做到这一点的例子:

def chain_as_ints(*iterables):
    for iterable in iterables:
        for item in iterable:
            yield int(item)

你可以像这样使用它:

sum(chain_as_ints(num, num2, num3))

在这种情况下,生成器功能并不是必需的(并且考虑到替代方案可能不可取)我只想提及它的完整性。

答案 1 :(得分:0)

由于您希望将每个列表的元素作为一个长列表进行迭代,因此最简单的方法是将它们连接起来:

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