大家小时候可能玩过“谁”-“什么时候”-“在哪里”-“干什么”的游戏,这个游戏用Python来表述是这样的:
import random who = ['王小一', '张小二', '李小三', '朱小四'] 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 itertools who = ['王小一', '张小二', '李小三', '朱小四'] when = ['早上8点', '下午3点', '凌晨2点'] where = ['在厕所','在卧室', '在姐姐房间里', '在教室里'] do = ['拉屎', '抽烟', '打架'] for result in itertools.product(who, when, where, do): print(''.join(result))
运行效果如下图所示:
itertools.product
可以接收非常无数个可迭代的对象,然后把他们想for循环嵌套一样拼接起来。