Python最快的随机化字符串的方式

时间:2011-12-01 16:38:01

标签: python string variables random

我想随机化一个字符串的情况,继承我所拥有的:

word="This is a MixeD cAse stRing"
word_cap=''
for x in word:
        if random.randint(0,1):
                word_cap += x.upper()
        else:
                word_cap += x.lower()
        word = word_cap

print word

我想知道你是否可以使用列表理解来加快速度。 我似乎无法在randomchoice中使用lower()和upper()函数 我试着做像

这样的事情
''.join(randomchoice(x.upper(),x.lower()) for x in word)

但我认为那是错的。这样的事情虽然可能吗?

2 个答案:

答案 0 :(得分:8)

import random
s = 'this is a lower case string'

''.join(random.choice((str.upper,str.lower))(x) for x in s)

random.choice从两个函数str.upperstr.lower中随机选择一个。

然后,此函数将应用于输入字符串x中每个字母的s

如果初始字符串的所有字母都是小写的,我将使用此代码:

''.join(x.upper() if random.randint(0,1) else x for x in s)

因为在小写初始字符串的情况下,初始代码会在一半字母上使用冗余str.lowercase

顺便说一句,请看Michael J. Barber的另一个答案。 Python对函数调用收费很高。在他的代码中,他只调用str.upper一次。在我的代码str.upper中调用大约一半的初始字符串符号。因此,在内存中仍然会创建一个临时的大写字符串,他的代码的时间效率可能会更高。


看见:

代码时序比较:https://ideone.com/eLygn

答案 1 :(得分:4)

试试这个:

word="this is a lower case string"
caps = word.upper()
''.join(x[random.randint(0,1)] for x in zip(word, caps))

这应该胜过你的版本,因为它对upper的调用次数要少得多,因为更重要的是,它避免了你在带循环的版本中使用的O(N ^ 2)连续追加。

通过修改问题,您需要创建小写和大写版本:

word="This is a MixeD cAse stRing"
caps = word.upper()
lowers = word.lower()
''.join(random.choice(x) for x in zip(caps, lowers))

正如Tim Pietzcker在评论中所建议的那样,我使用random.choice来选择zip调用创建的元组中的字母。

由于问题已经改变,更多地关注速度,最快的方法可能是使用Numpy:

''.join(numpy.where(numpy.random.randint(2, size=len(caps)), list(caps), list(lowers)))