好吧,我们可以使用给定的代码段生成随机字母。
import random
stream_I = ''
for idx in range(0,10):
stream_I = stream_I + ' ' + random.choice('abcdefghijklmnopqrstuvwxyz')
print(stream_I)
但我想知道如何在给定两个条件的情况下生成小写字母52次 -
答案 0 :(得分:5)
您可以创建一个包含您想要出现的所有字母的字符串(即字母表的两倍),然后将该字符串随机播放,就好像它是一个列表一样。
from random import shuffle
import string
orig = 2 * string.ascii_lowercase # or use 2 * 'abcdefghijklmnopqrstuvwxyz'
l = list(orig)
shuffle(l)
print ' '.join(l) # concatenates every letter in shuffled list with a space in between
答案 1 :(得分:4)
另一种方式......
>>> random.sample('abcdefghijklmnopqrstuvwxyz' * 2, 52)
['s', 'z', 'c', 'j', 'f', 'k', 'i', 'h', 'f', 'u', 'n', 'u', 'x', 'g', 'v', 'o', 'g', 'x', 'n', 'h', 'q', 'm', 'l', 'k', 'q', 't', 'l', 't', 'z', 'p', 'r', 'd', 'b', 'a', 'p', 'w', 'r', 'e', 'w', 'y', 'v', 'm', 'j', 'c', 'o', 'a', 'd', 's', 'b', 'e', 'i', 'y']
或者如果您真的想将它们作为字符串加入:
>>> ''.join(random.sample('abcdefghijklmnopqrstuvwxyz' * 2, 52))
'idlosakvasfxzuhgerntpzgwivmuopqmybdhkycwtfnlcrjxjbeq'
或者如果你想用空格打印它们:
>>> print(*random.sample('abcdefghijklmnopqrstuvwxyz' * 2, 52))
t v q n x k g o x m w y i p u t f e h k s b a v r c i j q o l z m l g p d b h y a j r n e w u c d f z s
编辑:另一个,在我的测试中不那么漂亮但速度更快:
>>> sorted('abcdefghijklmnopqrstuvwxyz' * 2, key=lambda _: random.random())
['p', 'u', 'x', 'm', 'l', 's', 'z', 'p', 'q', 'h', 'g', 'l', 'j', 'r', 'a', 'o', 'o', 'v', 'z', 'r', 'd', 'b', 'c', 'i', 'f', 'c', 'f', 'i', 'v', 'h', 'n', 'w', 'n', 'k', 'u', 'e', 'x', 'g', 'a', 'k', 'w', 'd', 't', 'q', 'm', 'j', 'b', 's', 'e', 't', 'y', 'y']
时序:
>>> from timeit import timeit
>>> timeit("random.sample('abcdefghijklmnopqrstuvwxyz' * 2, 52)",
'import random', number=10**5)
4.6626533971370066
>>> timeit("sorted('abcdefghijklmnopqrstuvwxyz' * 2, key=lambda _: random.random())",
'import random', number=10**5)
1.3866641467300198
>>> timeit("sorted('abcdefghijklmnopqrstuvwxyz' * 2, key=lambda _: random())",
'from random import random', number=10**5)
1.2105088569363005
最后一个版本更合适...上面我只是没有使用它,因为问题的代码确实import random
。
与随机浮点数相比,sample
(和shuffle
)的大时间贡献者看起来可能是随机整数的生成:
>>> timeit('[randrange(52) for _ in range(52)]', 'from random import randrange', number=10**5)
4.8866115645862465
>>> timeit('[random() for _ in range(52)]', 'from random import random', number=10**5)
0.3504891341253824
根据this source判断,sample
和shuffle
实际上并不使用randrange
,而是使用“私有”_randbelow
,但我仍然怀疑这一点有点开销是原因。至少shuffle
可以更快,顺便说一句。正如源代码所示,我们可以给它一个random
函数作为参数,然后将直接使用它。一些时间:
>>> timeit('shuffle(a)', "from random import shuffle; a = list('abcdefghijklmnopqrstuvwxyz' * 2)", number=10**5)
3.863254275829604
>>> timeit('shuffle(a, random)', "from random import random, shuffle; a = list('abcdefghijklmnopqrstuvwxyz' * 2)", number=10**5)
1.8142924877242876
答案 2 :(得分:0)
以下是发布的工作方法之间的一些时间安排:
结果(100,000次循环)
Stefan_Pochmann: 8.842833116999827
johk95: 8.658055701991543
用于计时的脚本
from timeit import timeit
setup = """
from random import shuffle, sample
from string import ascii_lowercase
"""
methods = {
'Stefan_Pochmann': """
sample(ascii_lowercase * 2, 52)
""",
'johk95': """
orig = 2 * ascii_lowercase
l = list(orig)
shuffle(l)
' '.join(l)
"""
}
for author, method in methods.items():
print('{}: {}'.format(author, timeit(stmt=method, setup=setup, number=100000)))