2015-02-24 111 views
1

我试图生成词汇量可以由只'A', 'B', 'C', 'D' or '*'模式的不超过一个重复,人物可以重复任意次数,但美中不足的是,所产生的模式必须有至少一封信。生成列表中随机元素的一个元素

我试着用随机模块,这是我来到最接近我想要什么:

random.sample(set(vocabulary), 5) 
Out[30]: ['A', 'D', '*', 'B', 'C'] 

理想我想看到的输出,如:

A*** 
ABAB 
ABC* 

我该怎么办?

+0

字母/字母应该总是在一开始? – Carsten 2015-02-24 13:03:10

+0

不,它可以在任何地方 – 2015-02-24 13:03:35

回答

2

其实你想让你的列表元素的产品,你可以使用itertools.product

>>> from itertools import product 
>>> voc=['A', 'B', 'C', 'D', '*'] 
>>> for pro in product(voc,repeat=5): 
... print ''.join(pro) 
*AAAA 
*AAAB 
*AAAC 
*AAAD 
*AAA* 
*AABA 
*AABB 
*AABC 
. 
. 

如果你只是想获得平等的子集,你可以使用下面的列表理解的顺风车,例如:

>>> voc=['C', 'D', '*'] 
>>> list(product(voc,repeat=3)) 
[('C', 'C', 'C'), ('C', 'C', 'D'), ('C', 'C', '*'), ('C', 'D', 'C'), ('C', 'D', 'D'), ('C', 'D', '*'), ('C', '*', 'C'), ('C', '*', 'D'), ('C', '*', '*'), ('D', 'C', 'C'), ('D', 'C', 'D'), ('D', 'C', '*'), ('D', 'D', 'C'), ('D', 'D', 'D'), ('D', 'D', '*'), ('D', '*', 'C'), ('D', '*', 'D'), ('D', '*', '*'), ('*', 'C', 'C'), ('*', 'C', 'D'), ('*', 'C', '*'), ('*', 'D', 'C'), ('*', 'D', 'D'), ('*', 'D', '*'), ('*', '*', 'C'), ('*', '*', 'D'), ('*', '*', '*')] 
>>> list(i for i in product(voc,repeat=3)if len(set(i))>1) 
[('C', 'C', 'D'), ('C', 'C', '*'), ('C', 'D', 'C'), ('C', 'D', 'D'), ('C', 'D', '*'), ('C', '*', 'C'), ('C', '*', 'D'), ('C', '*', '*'), ('D', 'C', 'C'), ('D', 'C', 'D'), ('D', 'C', '*'), ('D', 'D', 'C'), ('D', 'D', '*'), ('D', '*', 'C'), ('D', '*', 'D'), ('D', '*', '*'), ('*', 'C', 'C'), ('*', 'C', 'D'), ('*', 'C', '*'), ('*', 'D', 'C'), ('*', 'D', 'D'), ('*', 'D', '*'), ('*', '*', 'C'), ('*', '*', 'D')] 
+0

是的!这是我想要的行为,但我也得到****,也许我可以用if检查语句来消除它?还是有另一种方法巧妙地避免所有****模式? 谢谢,现在python的文档有意义! – 2015-02-24 13:06:39

+0

@sindhus欢迎!我添加链接!,这是最后的结果! 'itertools'模块提供像'permutations'和'combinations'这样的变体函数,你可以在wiki中找到所有这些函数! – Kasramvd 2015-02-24 13:09:14

0
chars=['A', 'B', 'C', 'D', '*'] 
s="" 
L = len(chars) 
for i in range(0,5): 
    s += chars[random.randrange(0,L)] 

# now ensure that a character is present by setting a random character 
s[random.randrange(0,5)] = chars[random.randrange(0,L-1)] 
+0

尽管此代码块可以回答这个问题,你总是应该为它为什么这样做一些解释。 – 2015-02-24 14:48:05