从列表中生成一个元素的重复次数不超过一次的随机元素

2024-05-17 02:54:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试生成一个模式,它的词汇表只能由'A', 'B', 'C', 'D' or '*'组成,字符可以重复任意次数,但关键是生成的模式必须至少有一个字母。你知道吗

我尝试了随机模块,这是我最接近我想要的:

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

理想情况下,我希望看到如下输出:

A***
ABAB
ABC*

等等

我该怎么办?你知道吗


Tags: 模块or词汇表sample字母模式情况random
2条回答

实际上,如果您想要列表元素的乘积,可以使用^{}

>>> 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')]
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)]

相关问题 更多 >