Python随机更改字符串大小写的最快方法

6 投票
2 回答
1041 浏览
提问于 2025-04-17 07:29

我想把一个字符串的字母大小写随机化,这里是我现在的代码:

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.choicezip调用创建的元组中选择字母。

由于问题的重点已经转向速度,最快的方法可能是使用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

撰写回答