5

我遇到过这篇文章:如何在 Python 中生成列表的所有排列

但我需要更多的东西,即字符串的所有排列以及所有子串的所有排列。我知道这是一个很大的数字,但这可能吗?

4

2 回答 2

5
import itertools

def all_permutations_substrings(a_str):
    return (
        ''.join(item)
        for length in xrange(1, len(a_str)+1)
        for item in itertools.permutations(a_str, length))

但是请注意,这是真正的排列 - 例如,hello将有任何包含两个ls 的子串排列两次,因为l' 将被认为是“唯一的”。如果你想摆脱它,你可以通过 a 传递它set()

all_permutations_no_dupes = set(all_permutations_substrings(a_str))
于 2013-08-25T14:40:46.737 回答
1

正如您链接的问题所述,itertools.permutations是生成列表排列的解决方案。在 python 中,字符串可以被视为列表,所以itertools.permutations("text")可以正常工作。对于子字符串,您可以将长度作为可选的第二个参数传递给 itertools.permutations。

def permutate_all_substrings(text):
  permutations = []
  # All possible substring lengths
  for length in range(1, len(text)+1):
    # All permutations of a given length
    for permutation in itertools.permutations(text, length):
      # itertools.permutations returns a tuple, so join it back into a string
      permutations.append("".join(permutation))
  return permutations

或者,如果您更喜欢单行列表推导式

list(itertools.chain.from_iterable([["".join(p) for p in itertools.permutations(text, l)] for l in range(1, len(text)+1)]))
于 2013-08-25T14:41:53.067 回答