【问题标题】:Generate random element from list with no more than one repetition of one element从列表中生成随机元素,一个元素的重复次数不超过一次
【发布时间】:2015-02-24 13:00:00
【问题描述】:

我正在尝试生成一种模式,其词汇表只能包含 'A', 'B', 'C', 'D' or '*',字符可以重复任意次数,但问题是生成的模式必须至少有一个字母。

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

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

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

A***
ABAB
ABC*

等等

我该怎么办?

【问题讨论】:

  • 字母/字母应该总是在开头吗?
  • 不,它可以在任何地方

标签: python


【解决方案1】:

其实你想要你的列表元素的产品,你可以使用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')]

【讨论】:

  • 是的!这就是我想要的行为,但我也得到了 ****,也许我可以用 if check 语句来消除它?或者有没有其他方法可以巧妙地避开所有****模式?谢谢,现在关于它的 python 文档很有意义!
  • @sindhus 欢迎!我添加了链接!是的,这是最后一个结果! itertools 模块提供了像permutationscombinations 这样的变体函数,你可以在wiki 中找到它们!
【解决方案2】:
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)]

【讨论】:

  • 虽然这个代码块可能会回答这个问题,但您总是应该提供一些解释为什么它会这样做。
猜你喜欢
  • 2019-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-11
  • 2011-09-26
相关资源
最近更新 更多