如何在 Python 中创建深度嵌套循环

出于某种原因,我现在正在画一个空白。我想列出一个列表,代表足球最后一周(总共 16 场比赛)的所有可能结果。

不包括平局场景,应该有 2^16 (65536) 个结果。我知道我可以在每个循环中制作 16 个嵌套的 for 循环,范围长度为 2,但必须有更好的方法。

我希望每场比赛本质上都是一个列表(0 表示失败,1 表示胜利)。

长度为 65536 的列表中的结果示例:

指数 0(共 16 场比赛):

[[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[ 0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1]]

下一个索引可能看起来相同(例如),除了最后一个被翻转

[[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[ 0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[1,0]]

每个指数都是一周的独特结果。

有任何想法吗?


largeQ
浏览 204回答 2
2回答

慕婉清6462132

你是对的,有更好的方法来做到这一点。您可以简单地使用与您要执行的操作完全等效的product函数itertools。关于它的文档在这里。这很简单:>>> from itertools import product>>> outcomes = list(product(range(2), repeat=16))>>> print(len(outcomes))65536>>> print(outcomes[0])(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)>>> print(outcomes[10000])(0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0)你会注意到这并没有给你[0, 1]你期望的对子,但很明显,因为每场比赛只有两支球队,只需考虑每个位置显示的数字是第一支球队的得分,你可以推断出另一支球队则相反。

小怪兽爱吃肉

由于有65536个状态,可以用0到65535之间的整数表示,然后转成二进制,再转成你想要的列表。这是一些有效的代码:for i in range(65536):    s = "{:016b}".format(i)    l = [[1, 0] if ch == "1" else [0, 1] for ch in s]    print(s)第一行枚举从 0 到 65535的所有整数。第二行将数字转换为 16 位二进制数(例如0101010101010101)第三行将每个数字映射到[0, 1]or[1, 0]并创建您想要的列表。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python