如何迭代1和1的所有子组合?

时间:2014-04-09 02:36:30

标签: python string combinations

我们说我的字符串看起来像" 1000101"

我想迭代所有可能的方式来插入"!"在哪里" 1"是:

    1000101
    100010!
    1000!01
    1000!0!
    !000101
    !00010!
    !000!01
    !000!0!

可扩展到任何字符串和任意数量的" 1" s

3 个答案:

答案 0 :(得分:4)

至于(几乎)总是itertools.product来救援:

>>> from itertools import product
>>> s = "10000101"
>>> all_poss = product(*(['1', '!'] if c == '1' else [c] for c in s))
>>> for x in all_poss:
...     print(''.join(x))
...     
10000101
1000010!
10000!01
10000!0!
!0000101
!000010!
!0000!01
!0000!0!

(由于我们在这里使用单字符字符串,我们甚至可以使用

product(*('1!' if c == '1' else c for c in s))

如果我们想要的话。)

答案 1 :(得分:2)

你走了。递归结构是我可以生成s[1:]的所有子组合,然后对于每个组合,如果!s[0],我可以在前面1插入方式插入s[0]

def subcombs(s):
  if not s:
    return ['']

  char = s[0]
  res = []
  for combo in subcombs(s[1:]):
    if char == '1':
      res.append('!' + combo)
    res.append(char + combo)
  return res

print(subcombs('1000101'))
['!000!0!', '1000!0!', '!00010!', '100010!', '!000!01', '1000!01', '!000101', '1000101']

答案 2 :(得分:1)

使用生成器的方法:

def possibilities(s):
    if not s:
        yield ""
    else:
        for s_next in possibilities(s[1:]):
            yield "".join([s[0], s_next])
            if s[0] == '1':
                yield "".join(['!', s_next])

print list(possibilities("1000101"))

输出:

['1000101', '!000101', '1000!01', '!000!01', '100010!', '!00010!', '1000!0!', '!000!0!']