2010-02-19 47 views
5

Giả sử tôi có 4 từ, dưới dạng một chuỗi. Làm cách nào để tham gia tất cả chúng như thế này?Kết hợp các từ trong Python (hoán vị?)

s = orange apple grapes pear 

Kết quả sẽ là một String:

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

Tôi đang nghĩ đến:

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

Và sau đó sử dụng liệt kê? Đó là những gì bạn sẽ sử dụng để làm chức năng này?

+0

Là trật tự trong kết quả quan trọng? –

+0

Không, nhưng tôi cho rằng điều đó sẽ dễ dàng hơn, đúng không? (Tôi chỉ mới với Enumerate) – TIMEX

+0

bạn cũng muốn có orangegrapespear, nho, lê? Điều này sẽ làm cho câu hỏi của bạn có ý nghĩa hơn – forefinger

Trả lời

4

Có thể đây là những gì bạn muốn?

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 

Nếu chạy trên 'abc' (cho rõ ràng) kết quả là:

bc/ac/ab/abc 

(Cập nhật sau khi bình luận từ poster.)

+0

Làm thế nào điều này sẽ thay đổi nếu tôi chỉ muốn các từ liên kết? Nói cách khác, tôi không muốn " một "," b ", hoặc" c "một mình. (Chỉ có các từ được kết hợp) Cảm ơn – TIMEX

+0

Đã cập nhật câu trả lời cho các yêu cầu mới của bạn –

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) 

Điều này cho phép tất cả các tập con của danh sách các từ ngoại trừ từ trống, các từ đơn lẻ và tất cả các từ. Ví dụ của bạn: orangeapple/orangegrapes/applegrapes/orangeapplegrapes/orangepear/applepear/orangeapplepear/grapespear/orangegrapespear/applegrapespear

+0

nhờ ngón trỏ số – 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

Yeah +1: kết hợp là một lựa chọn tốt ở đây. –

Các vấn đề liên quan