希望您能对我有所帮助,我想从以下列表列表中生成组合(用作nxn矩阵):
T
但是我需要,例如,如果我采用第一个列表的第一个数字,那么作为矩阵运算,请删除所选元素的列和行中的其他元素,然后生成可能的组合
例如,我在第一个列表中选择1,然后唯一可能生成的组合是:(1,5,9)和(1,8,6),因为消除了行和列。
我正在尝试构建一个递归函数以通过删除列和行来实现这一点,问题是我不确定如何使用组合来构建列表。
这是我到目前为止:
A = [[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
使用上面的矩阵,我期望有:
list = []
def combinations(matrix):
matrix_rows = len(matrix)
if matrix_rows == 0:
# Base case
return matrix
else:
# Recursive case
# Always select first row
seq = []
for index, a in enumerate(matrix[0]):
E = a
seq.append(E)
# Remove i from row of index element a
new_matrix = remove_row(matrix, 0)
# Remove j from column index of element a
new_matrix = remove_column(new_matrix, index)
# Call again with new matrix
combinations(new_matrix)
list.append(seq)
return list
def remove_row(original_matrix, element_row_index):
new_matrix = []
if (len(original_matrix)) >= element_row_index:
new_matrix = original_matrix[:]
new_matrix.remove(original_matrix[element_row_index])
return new_matrix
def remove_column(matrix, index):
return [(x[0:index] + x[index + 1:]) for x in matrix]
有人可以帮助我吗?或给我一个更好的方法的建议
已添加:一个4x4的示例:
A = [[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
print("Result: ", combinations(A))
Result: [[1,5,9], [1,6,8], [2,4,9], [2,6,7], [3,4,8], [3,5,7]]
答案 0 :(得分:4)
我认为这可以简单地完成,而无需递归。
基本上,您希望在依次浏览列(或行)的同时选择行(或列)上range(n)
的所有可能排列。
这是一个简单的解决方案:
from itertools import permutations
import numpy as np
n = 3
x = np.arange(n ** 2).reshape((n, n)) + 1 # so as to fit in with your example
perms = permutations(range(n))
combinations = [list(x[range(n), p]) for p in perms]
print(combinations)
>> [[1, 5, 9], [1, 6, 8], [2, 4, 9], [2, 6, 7], [3, 4, 8], [3, 5, 7]]
但是,如果您不是使用兼容numpy的东西,而是使用列表列表,则可以对上面的内容进行一些细微调整,使其同样有效:
x = [[1, 'A'], [2, 'B']] # a "small" case so it's easy to follow
n = len(x)
index_list = range(n)
perms = permutations(index_list)
combinations = [[x[i][p[i]] for i in index_list] for p in perms]
print(combinations)
>> [[1, 'B'], ['A', 2]]
以上内容假设您仍在使用“正方形”数据。这意味着每个内部列表的长度与包含它们的外部列表的长度相同。
希望有帮助,并且可以实现您的期望。如果没有,请发表评论,我会做任何纠正。我将把它变成函数供读者阅读;-)
祝你好运!