python实现排列组合

前言

假如有一个题目如:

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'}]

最后在对结果进行处理,这里就不进行了。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

图解AI

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值