向量中元素的所有组合都位于较大的向量中

All combinations of elements in a vector in a larger vector

提问人:petyar 提问时间:11/4/2023 更新时间:11/4/2023 访问量:61

问:

我有以下输入向量。

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

我必须经常这样做,并且对于不同大小的输入向量和输出向量。

Python 组合

评论

2赞 Kelly Bundy 11/4/2023
看起来你错过了四个
0赞 PM 77-1 11/4/2023
确切的规则是什么?它与“输入向量中的一个给定值只能在输出向量中出现一次”有何关联?['a','b','a','c']

答:

5赞 Andrej Kesely 11/4/2023 #1

IIUC,您可以使用模块中的multiset_permutationssympy

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我不认为这是黑客或作弊。我只是将值直接放在我想要的地方(而不是绕道通过额外的变量和额外的赋值,我想你会这样做?