提问人:petyar 提问时间:11/4/2023 更新时间:11/4/2023 访问量:61
向量中元素的所有组合都位于较大的向量中
All combinations of elements in a vector in a larger vector
问:
我有以下输入向量。
['a','b','c']
我想列出所有可能的组合。
有三个限制:
- 这些值必须插入到六个位置的输出向量中。
- 输入向量中的一个给定值在输出向量中只能出现一次。
- 值在输出向量中的顺序必须与在输入向量中相同。
两个权限:
- 位置可以留空。
- (此处未显示:)输入向量可以具有任何给定值中的多个值(例如
['a','b','a','c']
)
鉴于上面的这个输入向量,唯一有效的输出如下(我可能错过了一两个,但你明白了):
[' ',' ',' ','a','b','c'],
[' ',' ','a',' ','b','c'],
[' ','a',' ',' ','b','c'],
['a',' ',' ',' ','b','c'],
[' ',' ','a','b',' ','c'],
[' ','a','b',' ',' ','c'],
['a','b',' ',' ',' ','c'],
[' ','a',' ','b',' ','c'],
['a',' ','b',' ',' ','c'],
['a',' ',' ','b',' ','c'],
[' ',' ','a','b','c',' '],
[' ','a','b','c',' ',' '],
['a','b','c',' ',' ',' '],
[' ','a',' ','b','c',' '],
['a',' ','b','c',' ',' '],
['a',' ','b',' ','c',' ']
我的第一个想法是生成大约 6 个!向量,其中向量是可能值的随机组合,包括空值: 然后删除所有 a/b/c 在输入向量中出现次数多且 ABC 顺序与输入向量不同向量的向量。但这种蛮力措施需要很长时间。[abc ]|[abc ]...[abc ]
我必须经常这样做,并且对于不同大小的输入向量和输出向量。
答:
5赞
Andrej Kesely
11/4/2023
#1
IIUC,您可以使用模块中的multiset_permutations
:sympy
from sympy.utilities.iterables import multiset_permutations
l = ["a", "b", "c"]
for p in multiset_permutations([0] * 3 + [1] * 3):
i = iter(l)
print([" " if v == 0 else next(i) for v in p])
指纹:
[' ', ' ', ' ', 'a', 'b', 'c']
[' ', ' ', 'a', ' ', 'b', 'c']
[' ', ' ', 'a', 'b', ' ', 'c']
[' ', ' ', 'a', 'b', 'c', ' ']
[' ', 'a', ' ', ' ', 'b', 'c']
[' ', 'a', ' ', 'b', ' ', 'c']
[' ', 'a', ' ', 'b', 'c', ' ']
[' ', 'a', 'b', ' ', ' ', 'c']
[' ', 'a', 'b', ' ', 'c', ' ']
[' ', 'a', 'b', 'c', ' ', ' ']
['a', ' ', ' ', ' ', 'b', 'c']
['a', ' ', ' ', 'b', ' ', 'c']
['a', ' ', ' ', 'b', 'c', ' ']
['a', ' ', 'b', ' ', ' ', 'c']
['a', ' ', 'b', ' ', 'c', ' ']
['a', ' ', 'b', 'c', ' ', ' ']
['a', 'b', ' ', ' ', ' ', 'c']
['a', 'b', ' ', ' ', 'c', ' ']
['a', 'b', ' ', 'c', ' ', ' ']
['a', 'b', 'c', ' ', ' ', ' ']
3赞
Kelly Bundy
11/4/2023
#2
从 6 个索引中选择 3 个并将元素放在那里:
from itertools import combinations
v = ['a','b','c']
n = 6
for I in combinations(range(n), len(v)):
out = [' '] * n
for i, out[i] in zip(I, v):
pass
print(out)
评论
0赞
Brian61354270
11/4/2023
无法想象有更简单的方法。黑客感觉就像作弊:)for i, out[i] in zip(I, v):
1赞
Kelly Bundy
11/4/2023
@Brian61354270我不认为这是黑客或作弊。我只是将值直接放在我想要的地方(而不是绕道通过额外的变量和额外的赋值,我想你会这样做?
评论
['a','b','a','c']