【问题标题】:How to generate all permutations of a list but also add strings that can be present only once in any permutation如何生成列表的所有排列,同时添加在任何排列中只能出现一次的字符串
【发布时间】:2017-01-02 17:43:41
【问题描述】:

itertools.product 非常方便地生成列表的所有排列,但是如何继续暗示另一个元素列表,其中该列表中的一个元素一次可以填充任何排列?

在伪代码中:

from itertools import product
product('ABC', repeat=1) + ['.', '%3A']
->A, B, C, .A, .B, .C, A., B., C., %3AA, %3AB, %3AC, A%3A, B%3A, C%3A

我想这不是微不足道的,必须调整排列构建算法。

【问题讨论】:

  • 有时询问您的问题比询问如何实施您设计的解决方案更容易(请参阅The X/Y Problem

标签: python algorithm combinatorics


【解决方案1】:

您有 3 个系列。将原始输入字符串作为列表,然后在前面添加和追加。分别生成这三个:

from itertools import chain, product

inputstring = 'ABC'
extra = ['.', '%3A']
for combo in chain(inputstring, 
        product(extra, inputstring), product(inputstring, extra)):
    combo = ''.join(combo)
    print(combo)

带有列表理解的演示:

>>> from itertools import chain, product
>>> inputstring = 'ABC'
>>> extra = ['.', '%3A']
>>> [''.join(combo) for combo in chain(inputstring, product(extra, inputstring), product(inputstring, extra))]
['A', 'B', 'C', '.A', '.B', '.C', '%3AA', '%3AB', '%3AC', 'A.', 'A%3A', 'B.', 'B%3A', 'C.', 'C%3A']

【讨论】:

  • 如果在我的伪代码中增加repeat 参数,我需要额外的字符串才能进入字符串,例如A.A, A%3AA, ..
  • @ChiseledAbs:请不要移动球门柱。将值放入 insideproduct 的另一个迭代;将product(inputstring, extra) 包装在一个生成器(表达式或函数)中,将额外的字母(combo + (combo[0],).
  • @ChiseledAbs:正如保罗在对您的问题的评论中指出的那样,您需要更清楚自己要解决的问题;它有助于为您提供该问题的明确解决方案,而不仅仅是如何实施您认为的解决方案。这样一来,我们最终就不会在常见问题中发现越来越多您还没有想到的变化。
猜你喜欢
  • 2023-03-04
  • 1970-01-01
  • 2011-02-06
  • 1970-01-01
  • 1970-01-01
  • 2010-09-11
  • 2018-09-25
  • 1970-01-01
  • 2011-05-13
相关资源
最近更新 更多