5

文字列として4つの単語があるとします。どうすればこのように全員に参加できますか?

s = orange apple grapes pear

結果は文字列になります。

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

私は考えています:

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

そして、列挙を使用しますか?それはあなたがこの機能をするために使うものですか?

4

5 に答える 5

4

多分これはあなたが望むものですか?

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

'ab c'で実行すると(わかりやすくするため)、結果は次のようになります。

bc/ac/ab/abc

(ポスターからのコメントで更新)

于 2010-02-19T21:28:50.853 に答える
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'
于 2010-02-19T22:19:45.423 に答える
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'
于 2010-02-19T21:56:46.327 に答える
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

于 2010-02-19T21:30:37.160 に答える
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'
于 2010-02-19T22:13:21.723 に答える