一日一技:如何用Python遍历多个列表元素的所有组合

大家小时候可能玩过“谁”-“什么时候”-“在哪里”-“干什么”的游戏,这个游戏用Python来表述是这样的:
import randomwho = ['王小一', '张小二', '李小三', '朱小四']when = ['早上8点', '下午3点', '凌晨2点']where = ['在厕所','在卧室', '在姐姐房间里', '在教室里']do = ['拉屎', '抽烟', '打架']
print(random.choice(who), random.choice(when), random.choice(where), random.choice(do))

运行效果如下图所示:

现在,我想知道这些句子一共有哪些组合,应该怎么办呢?

最常见的写法是嵌套4个for循环:

who = ['王小一', '张小二', '李小三', '朱小四']when = ['早上8点', '下午3点', '凌晨2点']where = ['在厕所','在卧室', '在姐姐房间里', '在教室里']do = ['拉屎', '抽烟', '打架']
for people in who:    for time in when:        for place in where:            for action in do:                print(people, time, place, action)

运行效果如下图所示:

这样写虽然可以实现效果,但显然4个for循环使得代码非常难看。

在Python中,对于这种情况,有现成的处理方法,那就是 itertools.product计算可迭代对象的笛卡尔积。

它的使用方法为:

import itertoolswho = ['王小一', '张小二', '李小三', '朱小四']when = ['早上8点', '下午3点', '凌晨2点']where = ['在厕所','在卧室', '在姐姐房间里', '在教室里']do = ['拉屎', '抽烟', '打架']
for result in itertools.product(who, when, where, do):    print(''.join(result))

运行效果如下图所示:

itertools.product可以接收非常无数个可迭代的对象,然后把他们想for循环嵌套一样拼接起来。

原文发布于微信公众号 - 未闻Code(itskingname)

原文发表时间:2019-06-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券