【问题标题】:How to create a sequential combined list in python?如何在python中创建一个顺序组合列表?
【发布时间】:2015-10-02 02:54:29
【问题描述】:

我有一个列表 ['a', 'b', 'c', 'd'] 我需要一个列表 ['a', 'ab', 'abc', 'abcd', 'b '、'bc'、'bcd'、'c'、'cd'、'd']。

我一直在查看itertools,但我不知道如何使这项工作发挥作用。

对于all combinations,代码为:

from itertools import permutations
stuff = ['a','b','c','d']
for i in range(0, len(stuff)+1):
    for subset in permutations(stuff, i):
           print(subset)

我需要做什么才能只返回顺序组合?我想我可以随时检查每个排列的顺序,但这似乎不是最好的方法。

【问题讨论】:

  • 你还需要'abc''d' 吗?因为否则我在您的列表中看不到任何逻辑。
  • 'abc' 是否也应该在您要构建的列表中?
  • 类似print([''.join(stuff[i:j]) for i in range(len(stuff)) for j in range(i+1, len(stuff)+1)])
  • 您想要组合,而不是排列,或者更确切地说是“有序”组合。见 itertools.combinations
  • 我撒谎了,组合就像 [('a', 'b', 'c'), ('a', 'b', 'd'), ('a', 'c ', 'd'), ('b', 'c', 'd')]

标签: python itertools


【解决方案1】:

很简单:

stuff = ['a','b','c','d']
print([''.join(stuff[i:j]) for i in range(len(stuff)) for j in range(i+1, len(stuff)+1)])

给予

['a', 'ab', 'abc', 'abcd', 'b', 'bc', 'bcd', 'c', 'cd', 'd']

【讨论】:

  • 列表中的内容将超过一个字符...这会导致问题吗?
  • @Joseph 我不明白?单个项目中的字符数无关紧要。
  • 对不起...脑死了一秒钟...看到 len() 并认为 len(characters)
【解决方案2】:

您可以通过理解列表来做到这一点:

>>> [''.join(['a', 'b', 'c', 'd'])[i:j+1] for i in range(4) for j in range(i, 4)]
['a', 'ab', 'abc', 'abcd', 'b', 'bc', 'bcd', 'c', 'cd', 'd']

但不确定是否要这样做。

【讨论】:

    【解决方案3】:

    我认为这应该可以解决问题:

    items = ['a', 'b', 'c', 'd']
    combinations = []
    for i, x in enumerate(items):
        combinations.append(x)
        accum = x
        for y in items[i+1:]:
            accum += y
            combinations.append(accum)
    

    【讨论】:

      【解决方案4】:

      这个函数可以做到:

      def subsequences(lst):
          return [''.join(lst[i: j+1])
                  for i in range(len(lst)) 
                  for j in range(i, len(lst))]
      
      >>> subsequences(['a', 'b', 'c'])
      ['a', 'ab', 'abc', 'b', 'bc', 'c']
      >>> subsequences(['a', 'b', 'c', 'd'])
      ['a', 'ab', 'abc', 'abcd', 'b', 'bc', 'bcd', 'c', 'cd', 'd']
      

      【讨论】:

        【解决方案5】:

        另一种可能的解决方案(不使用itertools),这次使用帮助程序来清楚地说明:

        def combine(lst):
            return [''.join(lst[0:i+1]) for i in xrange(len(lst))]
        
        lst = ['a', 'b', 'c', 'd']
        sum([combine(lst[i:]) for i in xrange(len(lst))], [])
        => ['a', 'ab', 'abc', 'abcd', 'b', 'bc', 'bcd', 'c', 'cd', 'd']
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-09-27
          • 1970-01-01
          • 2021-11-24
          • 2019-03-31
          • 2020-01-01
          • 2011-08-21
          相关资源
          最近更新 更多