如何在不重复的情况下生成一组字符的所有组合?

rba*_*dar 5 python python-2.7

我有以下清单:

['a', 'b', 'c']
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种方法来生成包含这些字符的所有可能的字符串,并具有以下限制:

  • 可能不会出现字符多次(aababaabca等等是无效的)
  • 一个字符可以被排除在外(ab是有效的,即使c是不存在;a也即使有效bc不存在)

我可以用

[''.join(p) for p in permutations('abc')]
Run Code Online (Sandbox Code Playgroud)

生成包含a,b和 的所有字符串c。但是我也必须这样做

[''.join(p) for p in permutations('ab')]
[''.join(p) for p in permutations('ac')]
[''.join(p) for p in permutations('bc')]
Run Code Online (Sandbox Code Playgroud)

您可能会知道可用字符的初始列表是否很长,我需要做很多工作。所以我在 Python 中寻找一种优雅的方式来生成上述所有内容,只将允许的字符列表作为输入:

def generate(vals=['a', 'b', 'c']):
  # The initial list of allowed characters also has to be part of the 
  # final list since these also represent valid values
  res = vals
  # Generate all possible strings and store in res

  return res
Run Code Online (Sandbox Code Playgroud)

我需要这个,因为我想为我的 Web 服务器的 POST 请求提供一个参数,其中一个参数(我们称之为val)可以采用不同的唯一值(单个字符或这些值的组合)以触发一些数据生成。可用值列表会随着时间的推移而增长,因此我想通过自动检查给定值val是否有效来更轻松地处理请求。

我也一直在考虑遍历允许字符列表的每个元素并将它的其余部分连接起来('a'、'ab'、'ac'、'abc'、'b'、'ba'、'bc'等)但我不知道该怎么做。

Işı*_*lan 3

已经发布了正确的答案,但我想尝试一下,使其尽可能具有可读性。

from itertools import permutations as p

def gen(lst):
    y = [[a for a in p(lst,y)] for y in range(1,len(lst)+1)]

    this = []
    for i in y:
        while len(i)>0:
            this.append(i.pop())
    return [''.join(x) for x in this]

print(gen(['a','b','c']))
Run Code Online (Sandbox Code Playgroud)