gpt4 book ai didi

python - 使用特定规则在 Python 中生成排列

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:14:46 26 4
gpt4 key购买 nike

假设 a=[A, B, C, D],每个元素都有一个权重 w,如果被选中则设置为 1,否则设置为 0。我想按以下顺序生成排列

1,1,1,1
1,1,1,0
1,1,0,1
1,1,0,0
1,0,1,1
1,0,1,0
1,0,0,1
1,0,0,0

0,1,1,1
0,1,1,0
0,1,0,1
0,1,0,0
0,0,1,1
0,0,1,0
0,0,0,1
0,0,0,0

让项目 A,B,C,D 的 w=[1,2,3,4] ... 和 max_weight = 4。对于每个排列,如果累积权重超过 max_weight,则停止计算该排列,移动到下一个排列。例如。

1,1,1    --> 6 > 4, exceeded, stop, move to next
1,1,1 --> 6 > 4, exceeded, stop, move to next
1,1,0,1 --> 7 > 4 finished, move to next
1,1,0,0 --> 3 finished, move to next
1,0,1,1 --> 8 > 4, finished, move to next
1,0,1,0 --> 4 finished, move to next
1,0,0,1 --> 5 > 4 finished, move to next
1,0,0,0 --> 1 finished, move to next
etc calculation continue

到目前为止,[1,0,1,0]是不超过max_weight 4的最佳组合

我的问题是

  1. 生成所需排列的算法是什么?或者我可以生成排列的任何建议?
  2. 由于元素个数最多可达10000个,如果分支的累计权重超过max_weight则停止计算,所以计算前不需要先生成所有排列。 (1) 中的算法如何动态生成排列?

最佳答案

使用itertools.product生成排列的函数。

from itertools import *

w = [1,2,3,4]
max_weight = 4
for selection in product([1,0], repeat=len(w)):
accum = sum(compress(w, selection))
if accum > 4:
print '{} --> {} > {}, exceeded, stop, move to next'.format(selection, accum, max_weight)
else:
print '{} --> {} , finished, move to next'.format(selection, accum)

使用itertools.compress通过选择过滤权重。

>>> from itertools import *
>>> compress([1,2,3,4], [1,0,1,1])
<itertools.compress object at 0x00000000027A07F0>
>>> list(compress([1,2,3,4], [1,0,1,1]))
[1, 3, 4]

关于python - 使用特定规则在 Python 中生成排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17387110/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com