为了账号安全,请及时绑定邮箱和手机立即绑定

python:map()在地图迭代器中使用变量进行两次迭代

python:map()在地图迭代器中使用变量进行两次迭代

狐的传说 2021-03-05 18:09:57
有没有办法将以下行作为地图包括在内?   alist = []   for name in range(4):            for sname in range(15):                final = Do_Class(name, sname) #Is a class not to be bothered with                alist.append(final)而是作为alist.append(map(.....也许里面有多个地图?))更新:x = [Do_Class(name, sname) for name in xrange(15) for sname in xrange(4)]alist = [i for i in x]上面的工作没有错误alist = [i for i in Do_Class(name, sname) for name in xrange(15) for sname in xrange(4)]抛出UnboundLocalError:赋值之前引用了本地变量'sname'这一定是Python中最笨拙的事情
查看完整描述

3 回答

?
30秒到达战场

TA贡献1828条经验 获得超6个赞

我会用itertools.product:


from itertools import product

alist = [Do_Class(x[0], x[1]) for x in product(range(4), range(15))]

如果您绝对需要map:


alist = map(lambda x: Do_Class(x[0], x[1]), product(range(4), range(15)))

如果您想使用较短的版本,但可读性较差:


alist = map(Do_Class, sorted(range(4)*15), range(15)*4)

编辑

需要对range(4)* 15进行排序以获得0,0,0,...,1,...而不是0,1,2,3,0,...


编辑2

我偶然发现itertools.starmap,它应该显示以下内容:


from itertools import starmap

from itertools import product

alist = starmap(Do_Class, product(range(4), range(15)))

认为这也是一个不错的解决方案。


查看完整回答
反对 回复 2021-03-31
?
繁花如伊

TA贡献2012条经验 获得超12个赞

您不需要/不需要map

alist = [Do_Class(name, sname) for sname in range(15) for name in range(4)]

map仅当您可以执行类似操作时才使用map(somefunc, somelist)。如果不是这种情况,则您需要一个lambda,与列表理解相比,它只会增加不必要的开销。


查看完整回答
反对 回复 2021-03-31
?
守候你守候我

TA贡献1802条经验 获得超10个赞

alist = map(lambda name : map(lambda sname : Do_Class(name, sname), range(15)), range(4)) #please don't do this


查看完整回答
反对 回复 2021-03-31
  • 3 回答
  • 0 关注
  • 221 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号