【问题标题】:How to Make a Deep Nested Loop in Python如何在 Python 中创建深度嵌套循环
【发布时间】:2018-12-25 05:20:04
【问题描述】:

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

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

我希望每场比赛本质上都是一个列表(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]]

每个索引都是一周的独特结果。

有什么想法吗?

谢谢

【问题讨论】:

    标签: python arrays list for-loop nested-loops


    【解决方案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][1, 0] 并创建您想要的列表。

    【讨论】:

      【解决方案2】:

      你说得对,有更好的方法可以做到这一点。您可以简单地使用 itertools 中的 product 函数,这与您正在尝试执行的操作完全相同。 docs on it are here

      很简单:

      >>> 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] 对,但显然由于每场比赛只有两支球队,只需将每个位置显示的数字视为第一支球队的得分,您可以推断出另一支球队的得分与此相反。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-01
        • 2015-11-17
        • 2021-10-02
        相关资源
        最近更新 更多