Skip to main content
 首页 » 编程设计

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

2024年08月16日4898°冷暖

我知道有一种方法可以让 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] 所有的整数

reduce 应将其加起来为 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"(每个可迭代的第一个元素)下一次迭代将返回 "2", "5 "、"8" 和最后一次迭代 "3"、"6"、"9"。

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

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

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

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

要获得它,您需要 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。

最后,为了减少它,我实际上会使用内置的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)) 

在这种情况下,生成器函数并不是真正必要的(考虑到替代方案,可能不建议使用)我只是为了完整性而提及它。