前言
假如有一个题目如:
arr = ["S","O","S","S","O","S","S","O","S","S"]
//其中"O"有两种可能性:“S”或者“-”,罗列出所有的可能结果,且原有的顺序不能改变。
如果用其他语言实现相对比较麻烦,用python自带的迭代器就非常简单。
实现
from itertools import product
arr = ["S","O","S","S","O","S","S","O","S","S"]
arr_index = [] ## 存储O的index
arr_value = [] ## 存储O
arr_source = [] ## 存储非O的元素
for i in range(len(arr)):
if arr[i] == "O":
arr_index.append(i) ## 存储O的index
arr_value.append(arr[i]) ## 存储O
else:
arr_source.append({i:arr[i]}) # 转化为{index:value} 形式存储
print(arr_index)
print(arr_value)
print(arr_source)
fomat = ["S","-"] #假设每一个O有两种选择:S,_
lens = len(arr_value)
res_1 = [] #排列组合的结果
for item in product(fomat,repeat=lens):
arr = []
for i in range(len(item)):
arr.append({arr_index[i]:item[i]})
res_1.append(arr)
res_2 = [] #存储最终的一个结果
for item in res_1:
arr = []
arr.extend(item)
arr.extend(arr_source)
print(arr)
res_2.append(arr)
print(res_2)
结果
[1, 4, 7]
['O', 'O', 'O']
[{0: 'S'}, {2: 'S'}, {3: 'S'}, {5: 'S'}, {6: 'S'}, {8: 'S'}, {9: 'S'}]
[{1: 'S'}, {4: 'S'}, {7: 'S'}, {0: 'S'}, {2: 'S'}, {3: 'S'}, {5: 'S'}, {6: 'S'}, {8: 'S'}, {9: 'S'}]
[{1: 'S'}, {4: 'S'}, {7: '-'}, {0: 'S'}, {2: 'S'}, {3: 'S'}, {5: 'S'}, {6: 'S'}, {8: 'S'}, {9: 'S'}]
[{1: 'S'}, {4: '-'}, {7: 'S'}, {0: 'S'}, {2: 'S'}, {3: 'S'}, {5: 'S'}, {6: 'S'}, {8: 'S'}, {9: 'S'}]
[{1: 'S'}, {4: '-'}, {7: '-'}, {0: 'S'}, {2: 'S'}, {3: 'S'}, {5: 'S'}, {6: 'S'}, {8: 'S'}, {9: 'S'}]
[{1: '-'}, {4: 'S'}, {7: 'S'}, {0: 'S'}, {2: 'S'}, {3: 'S'}, {5: 'S'}, {6: 'S'}, {8: 'S'}, {9: 'S'}]
[{1: '-'}, {4: 'S'}, {7: '-'}, {0: 'S'}, {2: 'S'}, {3: 'S'}, {5: 'S'}, {6: 'S'}, {8: 'S'}, {9: 'S'}]
[{1: '-'}, {4: '-'}, {7: 'S'}, {0: 'S'}, {2: 'S'}, {3: 'S'}, {5: 'S'}, {6: 'S'}, {8: 'S'}, {9: 'S'}]
[{1: '-'}, {4: '-'}, {7: '-'}, {0: 'S'}, {2: 'S'}, {3: 'S'}, {5: 'S'}, {6: 'S'}, {8: 'S'}, {9: 'S'}]
最后在对结果进行处理,这里就不进行了。。。