随机大写字母串中的字母

use*_*890 14 python lowercase python-3.x uppercase

我想随机大写或小写字符串中的每个字母.我是新手在python中使用字符串,但我认为因为字符串是不可变的,所以我不能执行以下操作:

i =0             
for c in sentence:
    case = random.randint(0,1)
    print("case = ", case)
    if case == 0:
        print("here0")
        sentence[i] = sentence[i].lower()
    else:
        print("here1")
        sentence[i] = sentence[i].upper()
    i += 1
print ("new sentence = ", sentence)
Run Code Online (Sandbox Code Playgroud)

并得到错误:TypeError:'str'对象不支持项目分配

但那么我怎么能这样做呢?

blh*_*ing 21

您可以使用这样str.join的生成器表达式:

from random import choice
sentence = 'Hello World'
print(''.join(choice((str.upper, str.lower))(c) for c in sentence))
Run Code Online (Sandbox Code Playgroud)

样本输出:

heLlo WORLd
Run Code Online (Sandbox Code Playgroud)

  • @ U9-Forward你是对的.`join`需要一个列表,所以首先给它一个列表比给它一个生成器要快.[权威参考](/sf/answers/634271711/). (8认同)
  • @timgeb我当时纠正了.谢谢. (3认同)
  • 不,列表理解会更慢,因为它会在将列表传递给`join`之前首先实现所有项值以形成列表,从而导致时间和内存的更多开销.使用生成器表达式,`join`方法将能够简单地迭代生成器输出,因为生成器逐个生成项值. (2认同)
  • 很好..,谢谢你告诉我 (2认同)

tim*_*geb 6

构建一个新字符串.

这是一个对原始代码几乎没有变化的解决方案:

>>> import random
>>> 
>>> def randomcase(s):
...:    result = ''
...:    for c in s:
...:        case = random.randint(0, 1)
...:        if case == 0:
...:            result += c.upper()
...:        else:
...:            result += c.lower()
...:    return result
...:
...:
>>> randomcase('Hello Stackoverflow!')
>>> 'hElLo StaCkoVERFLow!'
Run Code Online (Sandbox Code Playgroud)

编辑:删除我的oneliners因为我喜欢blhsing更好.