2009-10-19 40 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