Python-使用输出数组索引约束创建置换

Python-使用输出数组索引约束创建置换,python,iteration,permutation,itertools,Python,Iteration,Permutation,Itertools,我想为一个数组创建所有可能的排列,其中每个元素只能出现一次,并对元素数组索引位置进行约束 ID=[“A”、“B”、“C”、“D”、“E”、“F”、“G”、“H”、“I”、“J”] 我想创建原始_数组的所有可能排列,但是每个元素的位置仅限于以下给出的索引位置: ID = ["A","B","C","D","E","F","G","H",&q

我想为一个数组创建所有可能的排列,其中每个元素只能出现一次,并对元素数组索引位置进行约束

ID=[“A”、“B”、“C”、“D”、“E”、“F”、“G”、“H”、“I”、“J”]

我想创建原始_数组的所有可能排列,但是每个元素的位置仅限于以下给出的索引位置:

ID = ["A","B","C","D","E","F","G","H","I","J"]

Index_Options=[]
for i in range(len(ID)):
    List1=[]
    distance=3
    value = i - distance
    for j in range((int(distance)*2)):
        if value < 0 or value > len(ID):
            print("Disregard") #Outside acceptable distance range
        else:
            List1.append(value)
        value=value+1
    Index_Options.append(List1)
    print(Index_Options)

#Index_Options gives the possible index positions for each element. ie "A" can occur in only index positions 0,1,2, "B" can occur in only index positions 0,1,2,3 ect.
ID=[“A”、“B”、“C”、“D”、“E”、“F”、“G”、“H”、“I”、“J”]
索引_选项=[]
对于范围内的i(len(ID)):
列表1=[]
距离=3
值=i-距离
对于范围内的j((int(距离)*2)):
如果值<0或值>长度(ID):
打印(“忽略”)#超出可接受的距离范围
其他:
列表1.追加(值)
值=值+1
索引\u Options.append(列表1)
打印(索引选项)
#Index_选项为每个元素提供可能的索引位置。即“A”只能出现在指数位置0,1,2,而“B”只能出现在指数位置0,1,2,3等。
我正在努力研究如何使用这些信息来创建所有的输出排列


任何帮助都将不胜感激

您可以使用
itertools.permutations
创建所有可能的排列,然后创建新列表,并检查所有字母是否位于正确位置

permutations = [p for p in itertools.permutations(ID, len(ID)) if all(i in Index_Options[ID.index(x)] for i, x in enumerate(p))]

可以使用递归生成器函数来构建组合。与其从
ID
生成所有可能的排列,然后基于
Index\u Options
进行过滤,不如直接遍历
Index\u Options
生成
ID
的笛卡尔积:

ID = ["A","B","C","D","E","F","G","H","I","J"]
def combos(d, c = [], s = []):
  if not d:
     yield c
  else:
     for i in filter(lambda x:x not in s and x < len(ID), d[0]):
        yield from combos(d[1:], c=c+[ID[i]], s=s+[i])

print(list(combos(Index_Options)))

非常感谢您的帮助,这非常有效,比排列方法更有效。感谢您的帮助,这非常有效,并达到了预期的效果:)
[['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'], ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'I'], ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'I', 'H', 'J'], ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'I', 'J', 'H'], ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'J', 'H', 'I'], ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'J', 'I', 'H'], ['A', 'B', 'C', 'D', 'E', 'F', 'H', 'G', 'I', 'J'], ['A', 'B', 'C', 'D', 'E', 'F', 'H', 'G', 'J', 'I'], ['A', 'B', 'C', 'D', 'E', 'F', 'H', 'I', 'G', 'J'], ['A', 'B', 'C', 'D', 'E', 'F', 'H', 'I', 'J', 'G']]