将嵌套 for 循环转换为等效的映射

问题描述 投票:0回答:4

示例:

for x in iterable1:
    expression

map
形式为:

map(lambda x: expression, iterable1)

如何将其扩展到仅使用

map
且不使用列表推导式的嵌套 for 循环?

示例:

for x in itr1:
    for y in itr2:
        expr
python python-3.x loops map-function
4个回答
6
投票

您可以使用

itertools.product
构建两个嵌套序列的笛卡尔积,然后
map
将您的表达式添加到该 2 元组列表:

from itertools import product

map(lambda (x, y): expression, product(itr1, itr2))

一些实际值的示例:

seq = map(lambda (x, y): '%s:%s' % (x, y), product(itr1, itr2))
for item in seq:
    print item

请注意,需要使用

lambda (x, y)
将序列中的每个 2 元组解压为表达式中使用的单独
x
y
参数。


2
投票

请耐心听我讲这一点。没有解释,但两天后就起作用了。仅使用地图和列表。这是糟糕的代码。欢迎提出缩短代码的建议。 Python 3 解决方案

使用列表理解的示例:

>>> a=[x+y for x in [0,1,2] for y in [100,200,300]]
>>> a
[100,200,300,101,201,301,102,202,302]

使用示例:

>>>a=[]
>>>for x in [0,1,2]:
...    for y in [100,200,300]:
...        a.append(x+y)
...
>>>a
[100,200,300,101,201,301,102,202,302]

现在仅使用地图的示例:

>>>n=[]
>>>list(map(lambda x:n.extend(map(x,[100,200,300])),map(lambda x:lambda y:x+y,[0,1,2])))
>>>n
[100,200,300,101,201,301,102,202,302]

更小的 python2.7 解决方案:

>>>m=[]
>>>map(lambda x:m.extend(x),map(lambda x:map(x,[100,200,300]),map(lambda x:lambda y:x+y,[0,1,2])))
>>>m
[100,200,300,101,201,301,102,202,302]

另一个变体:我通过电子邮件发送给 Mark Lutz,这是他的解决方案。这不使用闭包,并且是最接近嵌套 for 循环功能的。

>>> X = [0, 1, 2]               
>>> Y = [100, 200, 300]
>>> n = []
>>> t = list(map(lambda x: list(map(lambda y: n.append(x + y), Y)),X))
>>> n
[100,200,300,101,201,301,102,202,302]

1
投票

你不能。

lambda
特别限于返回值可以封装为单个表达式的函数:不允许使用语句。

您应该问自己的一个问题是,为什么您认为这是编写 Python 程序的理想方式?该语言已明确定义可读性,您应该尽一切努力保持可读性。


0
投票

我知道这已经很老了,但我遇到了同样的问题,并且使用嵌套列表理解或 itertools 感觉就像作弊,因为我知道可以仅使用高阶函数来做到这一点。 所以这是我的解决方案:

from functools import reduce
cross_prod=lambda li1,li2:reduce(lambda s,x: s+list(map(lambda y:(x,y),li2)),li1,[])
print(cross_prod(range(3),range(10,13)))

你可以看到它有效

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.