2

私は現在Pythonランドにいます。これが私がしなければならないことです。私はすでに itertools ライブラリを調べましたが、順列のみを行うようです。

['yahoo', 'wikipedia', 'freebase'] のような入力リストを取得し、1 つのアイテムと 0 個以上の他のアイテムの一意の組み合わせをすべて生成したい...

['yahoo', 'wikipedia', 'freebase']
['yahoo', 'wikipedia']
['yahoo', 'freebase']
['wikipedia', 'freebase']
['yahoo']
['freebase']
['wikipedia']

いくつかのメモ。順序は関係ありません。任意のサイズのリストを取得する方法を設計しようとしています。また、この組み合わせに名前はありますか?

ご協力いただきありがとうございます!

4

4 に答える 4

3
>>> l = ['yahoo', 'wikipedia', 'freebase']
>>> import itertools
>>> for i in range(1, len(l) +1):
    print(list(itertools.combinations(l, r=i)))


[('yahoo',), ('wikipedia',), ('freebase',)]
[('yahoo', 'wikipedia'), ('yahoo', 'freebase'), ('wikipedia', 'freebase')]
[('yahoo', 'wikipedia', 'freebase')]

PS なぜこの wiki なのですか?

于 2010-04-06T21:00:40.617 に答える
3

いわゆるパワーセットです。これはitertools docsからの実装です:

def powerset(iterable):
    "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
    s = list(iterable)
    return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))
于 2010-04-06T21:02:11.843 に答える
0

いわゆるパワーセットです。このアルゴリズムに従うだけです。簡単な実装を次に示します。

def powerset(seq):
  if len(seq):
    head = powerset(seq[:-1])
    return head + [item + [seq[-1]] for item in head]
  else:
    return [[]]

>>> powerset(['yahoo', 'wikipedia', 'freebase'])
[[], ['yahoo'], ['wikipedia'], ['yahoo', 'wikipedia'], ['freebase'], ['yahoo', 'freebase'], ['wikipedia', 'freebase'], ['yahoo', 'wikipedia', 'freebase']]

そしてもう一つ:

def powerset(s):
  sets = []
  indicator = lambda x: x & 1
  for element in xrange(2**len(s)):
    n = element
    subset = []
    for x in s:
        if indicator(n):
            subset.append(x)
        n >>= 1
    sets.append(subset)
  return sets
于 2010-04-06T20:59:33.130 に答える
0

あなたは基本的にバイナリで1 から 2 n -1まで数えています:

0 0 1    ['freebase']
0 1 0    ['wikipedia']
0 1 1    ['wikipedia', 'freebase']
1 0 0    ['yahoo']
1 0 1    ['yahoo', 'freebase']
1 1 0    ['yahoo', 'wikipedia']
1 1 1    ['yahoo', 'wikipedia', 'freebase']
于 2010-04-06T21:00:43.050 に答える