如何在python中生成没有重复字符的组合?

时间:2017-12-14 00:44:12

标签: python math combinations

我有以下字符集:

qwertyiopnmjk013

我希望生成所有可能的6个字符的字符串,并且还要生成7个字符,并注意每个字母只在同一个生成的字符串中出现一次。

在python中执行此操作的最佳形式是什么?任何一个例子?

现在我正在将charset复制到另一个变量然后我开始生成拾取字母并将它们从字符集中删除然后向前移动但我认为这不是最好的方式..

4 个答案:

答案 0 :(得分:2)

使用itertools:

<div></div>

答案 1 :(得分:2)

这个问题有点含糊不清,但这里有所有部分。 首先,只是为了获得组合:

import itertools
source = "qwertyiopnmjk013"
map(''.join, itertools.combinations(source, 6))

现在,即使你的源字符串你想要没有重复的字母 包含重复项,然后首先修复源字符串:

source = ''.join(set("qwertyiopnmjk013"))

如果您还希望每个订单中的每个组合重新排列, 然后你要处理排列,而不是组合。为了得到一个很好的列表:

reduce(lambda x, y: x + y, map(lambda x: map(''.join, itertools.permutations(x)), itertools.combinations(source, 6)))

你应该注意到,此时你已经进入了数百万字符串中;希望你有一台快速的机器。

答案 2 :(得分:0)

您可以使用itertools.combinations

import itertools
s = "qwertyiopnmjk013"
final_letters = [''.join(b) for b in [i for i in itertools.combinations(s, 6)]+[i for i in itertools.combinations(s, 7)] if len(set(b)) == len(b)]

答案 3 :(得分:0)

既然你说:

  

我希望生成所有可能的6个字符的字符串,并且还要生成7个字符,并注意每个字母只在同一个生成的字符串中出现一次。

我认为你的意思是排列,而不是组合。

在您的示例中,您没有重复的字符,但如果您这样做,您可以先将字符串转换为字符集。

from itertools import permutations

def permute_string(s, n):
    return map(lambda x: ''.join(x), permutations(set(s)))

my_string = 'qwertyiopnmjk013'
six_chars = list(permute_string(my_string, 6))
seven_chars = list(permute_string(my_string, 7))