【问题标题】:A Combinations of Items in Given List给定列表中的项目组合
【发布时间】:2010-04-06 20:55:40
【问题描述】:

我目前在 Python 领域。这是我需要做的。我已经查看了 itertools 库,但它似乎只做排列。

我想获取一个输入列表,例如 ['yahoo', 'wikipedia', 'freebase'] 并生成一个项目与零个或多个其他项目的每个唯一组合...

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

一些笔记。顺序无关紧要,我正在尝试设计方法来获取任何大小的列表。另外,这种组合有名字吗?

感谢您的帮助!

【问题讨论】:

    标签: python permutation combinations


    【解决方案1】:
    >>> 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')]
    

    附:为什么是这个wiki?

    【讨论】:

      【解决方案2】:

      它被称为powerset。这是来自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))
      

      【讨论】:

        【解决方案3】:

        你基本上是从 1 数到 2n-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']
        

        【讨论】:

        • 解决问题的有趣方法。我绝对不会这么想的。
        【解决方案4】:

        这就是所谓的幂集。只需关注此algorithm。这是一个简单的实现:

        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
        

        【讨论】:

          猜你喜欢
          • 2013-05-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-09
          相关资源
          最近更新 更多