我在 Python 中作業,我想獲得單個串列的某種“排列”。我會盡力解釋這個問題,但如果有任何疑問,請告訴我。
想象一下我們有一個字串串列a = ['?','A','A','A'],即有三個'A'元素:n=3。我想創建的方法來獲得的所有排列'A'S(并且是元素的其余部分'?'),遞減地,在這個意義上,在每個“排列層”的數目'A's被減一:n=n-1。
通過示例,可以更好地理解這一點:
例如,因為a我們將在第一個“置換層”中獲得a0 = ['?','A','A','?']、a1 = ['?','A','?','A']和。同理,在第二個'排列層'( ); 因為我們會有和,因為我們會有和,因為我們會有和。例如,我知道其中一些可能是多余的,并且;沒有問題。a2 = ['?','?','A','A'](n=3-1)n=3-1-1a0a00 = ['?','A','?','?']a01 = ['?','?','A','?']a1a10 = ['?','A','?','?']a11 = ['?','?','?','A']a2a20 = ['?','?','A','?']a21 = ['?','?','?','A']a00a10
請注意,一旦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的數量沒有減少。
uj5u.com熱心網友回復:
聽起來您想要一種方法來列出A用?s替換s 的某些子集的所有方法,這意味著它與找到選擇As的子集的所有方法(其中itertools有代碼)相同。
uj5u.com熱心網友回復:
這些并不是真正的排列。它們是 4 個 ['A','?'] 串列的乘積。
您可以使用 itertool 的 product 函式在不遞回的情況下獲得它們:
from itertools import product
for p in product(*['A?']*4): print(p)
('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 或 ? 向下以 n-1 作為計數的遞回:
def prod(values,n,result=[]):
for v in values:
if n == 1: yield [*result,v]
else: yield from prod(values,n-1,[*result,v])
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/399272.html
上一篇:用括號括起來的元素分割字串
