2010-02-19 7 views
5

4 단어가 있다고 가정합니다. 어떻게 이런 식으로 가입 할 수 있습니까?파이썬에서 단어 조합하기 (순열?)

"orangeapple/orangegrapes/orangepear/applegrapes/applepear/grapespear/orangeapplegrapes/orangeapplepear/applegrapespear" 

내가 생각하고 :

s = orange apple grapes pear 

결과는 문자열 될 것

list_words = s.split(' ') 
for l in list_words: 

그리고 열거 사용할 수 있습니까? 이것이 당신이이 기능을하기 위해 사용하는 것입니까?

+0

는 중요한 결과의 순서인가? –

+0

아니,하지만 그 일을 더 쉽게 만들 것이라고 생각 하나? (나는 단지 열거 형과 새로운 것입니다) – TIMEX

+0

당신은 포도, 배, orangegrapespear도 원하십니까? 이것은 귀하의 질문에 더 많은 의미를 만들 것입니다 – forefinger

답변

4

아마도 이것이 원하는 것일까요? 결과 (선명도) 'ABC'를 실행하면

s = "orange apple grapes pear" 

from itertools import product 
l = s.split() 
r='/'.join(''.join(k*v for k,v in zip(l, x)) 
      for x in product(range(2), repeat=len(l)) 
      if sum(x) > 1) 
print r 

입니다 :

bc/ac/ab/abc 

(포스터에서 주석 이후에 업데이트되었습니다.)이 목록의 모든 부분 집합을 제공

+0

결합 된 단어 만 원하는 경우이 변경 방법은 무엇입니까? 즉, 나는 " 감사합니다. – TIMEX

+0

새 요구 사항에 대한 답변이 업데이트되었습니다. –

1
s = 'orange apple grapes pear' 

list_words = s.split() 

num = len(list_words) 
ans = [] 
for i in xrange(1,2**num-1): 
    cur = [] 
    for j,word in enumerate(list_words): 
    if i & (1 << j): 
     cur.append(word) 
    if len(cur) > 1: 
    ans.append(''.join(cur)) 
print '/'.join(ans) 

빈 단어, 한 단어 및 모든 단어를 제외하고 귀하의 예를 들어 : orangeapple/orangegrapes/applegrapes/orangeapplegrapes/orangepear/applepear/orangeapplepear/grapespear/orangegrapespear/applegrapespear

+0

집게 손가락에 감사드립니다. – TIMEX

1
>>> import itertools 
>>> from itertools import combinations 
>>> s = "orange apple grapes pear".split() 
>>> res=[] 
>>> for i in range(2,len(s)+1): 
...  res += [''.join(x) for x in combinations(s,i)] 
... 
>>> '/'.join(res) 
'orangeapple/orangegrapes/orangepear/applegrapes/applepear/grapespear/orangeapplegrapes/orangeapplepear/orangegrapespear/applegrapespear/orangeapplegrapespear' 
1
>>> s = "orange apple grapes pear".split() 
>>> '/'.join(''.join(k) for k in [[s[j] for j in range(len(s)) if 1<<j&i] for i in range(1<<len(s))] if len(k)>1) 
'orangeapple/orangegrapes/applegrapes/orangeapplegrapes/orangepear/applepear/orangeapplepear/grapespear/orangegrapespear/applegrapespear/orangeapplegrapespear' 
4
>>> from itertools import combinations 
>>> s = "orange apple grapes pear".split() 
>>> '/'.join([''.join(y) for y in [ x for z in range(len(s)) for x in combinations(s,z)] if len(y)>1]) 
'orangeapple/orangegrapes/orangepear/applegrapes/applepear/grapespear/orangeapplegrapes/orangeapplepear/orangegrapespear/applegrapespear' 
+0

예 +1 : 조합은 여기에서 좋은 선택입니다. –