我想随机化一个字符串的情况,继承我所拥有的:
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)
但我认为那是错的。这样的事情虽然可能吗?
答案 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.upper
,str.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)))