2009-10-19 63 views
0

我知道如何生成一個集合的組合,並且這是Python中的內建(我使用的),無論如何。但如何生成替代組合?替換組合

假設我有一套有兩個相同的元素 - 例如,AABCDE。的3項

組合可能是:

"AAB" 
"ABC" 
"CDE" 

然而,該計劃將數ABC兩次 - 使用第一個A時,一次,並使用第二A.第二個

什麼生成這樣的組合而不重複的好方法是什麼?

謝謝。

+0

氣味功課。 – Malfist 2009-10-19 20:52:43

+0

我仍然對你想要什麼感到困惑。你能給出「AABCDE」情況下的完整輸出嗎? – 2009-10-19 21:16:12

+0

是的。 AABCDE的完整輸出將與itertools.combinations(AABCDE)上的調用集完全相同。 如果您有2把粉紅色椅子,1把綠色椅子和1把藍色椅子,您可以將多種方式組合使用?考慮到粉紅色的椅子適用於所有目的,並且可以使用同一組閤中的兩把粉紅色椅子。 – ooboo 2009-10-22 13:34:36

回答

2

將其轉換爲set,這是擺脫重複的最簡單的方法。

+1

不,我認爲「AAC」是一個有效的組合 – ooboo 2009-10-19 21:02:28

+0

所以,這與我的答案相矛盾。建立你的重複列表,然後套用。 – SilentGhost 2009-10-19 21:05:21

+1

我以爲你的意思是將原始列表轉換爲像其他人建議的設置。這仍然很棘手。如果我想要組合使用同一個項目的許多副本來替換列表,那麼效率非常低,並且您不能將其用作迭代器 – ooboo 2009-10-19 21:08:16

2
>>> import itertools 
>>> ["".join(x) for x in (itertools.combinations(set("AABCDE"),3))] 
['ACB', 'ACE', 'ACD', 'ABE', 'ABD', 'AED', 'CBE', 'CBD', 'CED', 'BED'] 
>>> 

從你的其他意見,我想我誤解了你在問什麼。

>>> import itertools 
>>> set("".join(x) for x in (itertools.combinations("AABCDE",3))) 
set(['AAE', 'AAD', 'ABC', 'ABD', 'ABE', 'AAC', 'AAB', 'BCD', 'BCE', 'ACD', 'CDE', 'ACE', 'ADE', 'BDE']) 
0
def stepper_w_w(l,stop):#stepper_with_while 
"""l is a list of any size usually you would input [1,1,1,1...], 
stop is the highest number you want to stop at so if you put in stop=5 
the sequence would stop at [5,5,5,5...] 
This stepper shows the first number that equals the last. 
This generates combinations with replacement. """ 
    numb1=1 
    while numb1<stop: 
     #print(numb1) 
     l[0]=numb1 
     NeL=0 
     while l[len(l)-1]<=numb1: 
      if l[NeL]==l[len(l)-1]: 
       l[NeL]+=1 
       l[(NeL+1):]=[1]*((len(l))-(NeL+1)) 
       print(l) 
       """iter_2s=NeL+1 
       while iter_2s<=(len(l)-1): #this is different from above 
        l[iter_2s]=2 
        iter_2s+=1 
        print(l)""" 
       NeL=-1 
      NeL+=1 
     numb1+=1