【发布时间】:2021-12-31 00:29:28
【问题描述】:
我在 Python 中工作,我想获得单个列表的某种“排列”。我会尽力解释问题,但如果有任何疑问,请告诉我。
假设我们有一个字符串列表a = ['?','A','A','A'],即有三个'A' 元素:n=3。我想创建一种方法来获取'A's 的所有排列(其余元素为'?'),从某种意义上说,在每个“排列层”中,'A' 的数量是递减的s 减一:n=n-1。
通过示例,这可以更好地理解:
例如,对于a,我们将在第一个“置换层”(n=3-1) 中获得a0 = ['?','A','A','?']、a1 = ['?','A','?','A'] 和a2 = ['?','?','A','A']。同理,在第二个“置换层”(n=3-1-1);对于a0,我们将有a00 = ['?','A','?','?'] 和a01 = ['?','?','A','?'],对于a1,我们将有a10 = ['?','A','?','?'] 和a11 = ['?','?','?','A'],对于a2,我们将有a20 = ['?','?','A','?'] 和a21 = ['?','?','?','A']。我知道其中一些可能是多余的,例如a00 和a10;没有问题。
请注意,一旦达到n=1,就没有更多的排列层,因为每个结果都是aN = ['?','?','?','?']。
澄清:图层确实很重要,因为我想测试列表是否包含属性(不重要提及)以更深入地了解图层。我会更好地解释:如果 a0 拥有该属性,那么我们将探索 a00 和 a01,否则我们不会。这样,我们可能不会探索所有的排列。因此,我只需要给定列表的方法,该方法获得立即 NEXT 层的排列,而不是其余的排列。如果是n=1,则返回任何内容,例如foo。
我不知道如何找到这个或类似的问题(事实上,谈论排列是否正确?)。这里最接近的帖子似乎是Recursive list of permutations,其中提到了“笛卡尔积”和“重复组合”等术语。但问题不一样。
我不在乎使用哪种方法来达到解决方案,我不是在寻找效率;但是,我觉得这可以通过在 n 上进行递归以优雅的方式完成。
谁能解决我的问题?我希望代码是用 Python 或类似语言给出的。
编辑 1
使用itertools.permutations() 不会产生预期的结果:
import itertools
a = ['?', 'A', 'A', 'A']
b = itertools.permutations(a)
for j in list(b):
print(j)
打印出来:
('?', 'A', 'A', 'A')
('?', 'A', 'A', 'A')
('?', 'A', 'A', 'A')
('?', 'A', 'A', 'A')
('?', 'A', 'A', 'A')
('?', 'A', 'A', 'A')
('A', '?', 'A', 'A')
('A', '?', 'A', 'A')
('A', 'A', '?', 'A')
('A', 'A', 'A', '?')
('A', 'A', '?', 'A')
('A', 'A', 'A', '?')
('A', '?', 'A', 'A')
('A', '?', 'A', 'A')
('A', 'A', '?', 'A')
('A', 'A', 'A', '?')
('A', 'A', '?', 'A')
('A', 'A', 'A', '?')
('A', '?', 'A', 'A')
('A', '?', 'A', 'A')
('A', 'A', '?', 'A')
('A', 'A', 'A', '?')
('A', 'A', '?', 'A')
('A', 'A', 'A', '?')
请注意,其中没有一个预期结果,因为As 的数量并未减少。
【问题讨论】:
-
层重要吗,还是您只想要所有排列(可能带有冗余)?
-
你能用
itertools.permutations()吗? -
您好,@ScottHunter,感谢您的提问!该层确实很重要,因为我想测试一个列表是否包含一个属性(不重要提及)以更深入地了解该层。我会更好地解释:如果
a0拥有该属性,那么我们将探索a00和a01,否则我们不会。这样,我们可能不会探索所有的排列。 -
嗨,@Barmar 我,感谢您的回答!不知道,马上试试!
-
因此,我只需要在给定列表的情况下获取立即 NEXT 层的排列的方法,而不是其余的。如果是
n=1,则返回任何内容,例如foo。
标签: python list subset permutation combinatorics