python-3.x - 生成n^2个元素列表的所有组合,每个元素从1到n?
问题描述
我正在尝试枚举给定大小的有效数独的数量。我有一个函数将数独转换为列表作为输入并检查它是否是有效的数独。我最初的方法只是编写嵌套的 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 个嵌套循环,所以我想将这种丑陋的方法推广到适用于任何大小的数独的东西。任何帮助,将不胜感激。
解决方案
只需导入模块的 Pythonproduct
内在函数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 repeat in python ,其中 order MATTERS以获取有关替代实现的更多详细信息。
推荐阅读
- json - 如何将 json 字符串数据类型列转换为配置单元中的映射数据类型列?
- mysql - 无法在 knex 节点 express 中将 multipleStatements 设置为 true
- android - 无法在屏幕底角绘制矩形
- c# - 如何从使用 dapper 返回的复杂对象中修剪所有字符串
- mysql - MariaDb 复制
- antlr4 - Antlr4 c++ 目标看起来像 java
- scilab - 在 xcos/scicos 中包含一个 Scilab 函数/脚本作为块
- matlab - 嵌套for循环不输出内部循环的值
- microsoft-cognitive - 教程语音意图识别不起作用?
- angular - 同时在 chrome 和 IE11 中支持 Angular Element 的问题