【问题标题】:Generate all combinations of a list of n^2 elements with each element being from 1 to n?生成 n^2 个元素列表的所有组合,每个元素从 1 到 n?
【发布时间】:2020-06-30 09:19:25
【问题描述】:

我正在尝试枚举给定大小的有效数独的数量。我有一个函数将数独转换为列表作为输入并检查它是否是有效的数独。我最初的方法只是编写嵌套的 for 循环来检查列表的每个组合。对于 2 x 2 数独,我的代码如下所示:

def enumerate2x2():

cnt = 0

for i1 in range(1,3):
    for i2 in range(1,3):
        for i3 in range(1,3):
            for i4 in range(1,3):
                if checkValidSudoku([i1, i2, i3, i4]):
                    cnt += 1

print(cnt)

此代码仅生成 4 元素列表(即 2x2 数独中有多少个正方形)的所有可能组合,列表中的每个元素要么是 1 要么是 2。然后它会检查每个组合。

但是,当我在 5x5 数独上尝试这个时遇到了一个问题,因为 python 只允许你有 20 个嵌套循环,所以我想将这种丑陋的方法推广到适用于任何大小的数独的东西。任何帮助将不胜感激。

【问题讨论】:

标签: python-3.x combinations itertools combinatorics sudoku


【解决方案1】:

Python product 内部函数,只需导入 itertools 模块,就是您所需要的:

import itertools

sudoku = list(itertools.product(range(1,3), repeat=4))

for x in range(len(sudoku)):
     print sudoku[x]

简单地计算您正在寻找的所有笛卡尔积,在输出下方:

(1, 1, 1, 1)
(1, 1, 1, 2)
(1, 1, 2, 1)
(1, 1, 2, 2)
(1, 2, 1, 1)
(1, 2, 1, 2)
(1, 2, 2, 1)
(1, 2, 2, 2)
(2, 1, 1, 1)
(2, 1, 1, 2)
(2, 1, 2, 1)
(2, 1, 2, 2)
(2, 2, 1, 1)
(2, 2, 1, 2)
(2, 2, 2, 1)
(2, 2, 2, 2)

现在似乎没有缺少任何组合,不是吗?查看其他问题Combinations with repetition in python, where order MATTERS 以了解有关替代实现的更多详细信息。

【讨论】:

  • “组合”函数省略了许多组合。例如,对于 2x2 数独,它返回 [1,1,1,1]; [1,1,1,2]; [1,1,2,2]; [1,2,2,2];和 [2,2,2,2],但未能返回例如 [1,1,2,1] 和 [2,2,1,1] 等组合。
  • 您是对的,因此您似乎需要 permutations 函数,但丢弃那些随后重复的结果。实际上,有一个 product 函数可以一次性为您完成。那就是笛卡尔积
  • 我刚刚更新了答案,现在对我有用,看看你是否可以接受这个答案来解决你的问题......我还添加了一个额外的标签(@987654331 @) 你的问题;)
  • 精彩的@wavepapi,因此,您能支持我的回答并接受吗? (在upvote ?按钮下方的绿色勾号✅)。非常感谢并享受!
  • 我投了赞成票,但显然我必须有 15 个声望才能出现在帖子上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 2018-03-11
  • 1970-01-01
  • 1970-01-01
  • 2021-04-22
相关资源
最近更新 更多