Python随机更改字符串大小写的最快方法
我想把一个字符串的字母大小写随机化,这里是我现在的代码:
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
我在想是不是可以用列表推导式来让它更快一些。可是我好像不能在随机选择中使用lower()和upper()这两个函数。我试着做了类似下面这样的:
''.join(randomchoice(x.upper(),x.lower()) for x in word)
但我觉得那样不对。不过,像这样的做法是可能的吗?
2 个回答
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)))
9
import random
s = 'this is a lower case string'
''.join(random.choice((str.upper,str.lower))(x) for x in s)
random.choice
是一个随机选择的工具,它可以从两个函数中选一个:str.upper
(把字母变成大写)和 str.lower
(把字母变成小写)。
然后,这个选择的函数会应用到输入字符串 s
中的每一个字母 x
上。
如果最开始的字符串里的字母都是小写的,我会用下面的代码:
''.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