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

2024-05-06 15:04:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道有一种方法可以让python map函数在一个命令中为多个迭代器执行,但是我一直在获取语法或值错误,或者如果它确实编译了,它就会覆盖以前的迭代或给出错误的答案。我做错什么了?在

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

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

^{pr2}$

Tags: and方法lambda函数命令mapreduce错误
2条回答

使用多个迭代器映射:

考虑到所需的中间输出,我认为map不是获得包含整数1-9的j的正确工具。在

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

{a1}

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

你的方法存在的问题:

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

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

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

其计算结果为7,因为这是链式ands的最后一个真实值:

^{pr2}$

这也解释了为什么结果是24,因为其他迭代的结果是8和{}:

>>> 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是与您想要的[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))

在这种情况下,生成器函数并不是真的必要的(而且考虑到其他选择,可能也不可取),我只想提一下它的完整性。在

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

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

相关问题 更多 >