如何在字符串中随机将字符转换为大写?

3
我希望有一种方法可以抓取一个字符串变量并随机将其中的字母大写,就像这样:
upperRandomizer("HelloWorld") == "HeLLoWORlD"

到目前为止,我已经尝试过以下方法:

for p in strVar:
        result = ""
        if random.choice((True, False)):
            result += p.upper()
        else:
            result += p

但是代码只输出了字符串变量的最后一个字母。我尝试使用join()方法但没有成功。希望能得到帮助。

8
每次循环你都将result重新定义为''。将其定义在循环外部。 - C.Nivs
4个回答

2

result变量移出循环。当前,每次遍历列表中的字符时,都会重新创建它。

result = ""
for p in strVar:
    if random.choice((True, False)):
        result += p.upper()
    else:
        result += p

你知道吗,你是对的,我简直不敢相信我直到现在才注意到这一点。谢谢! - RelaxAjax
当else语句返回result += p.lower()时,它也适用于strVar包含大写字母且您希望将大写字符随机转换为小写的情况。 - Bouke

2

这里有一个简短的描述:

import random

def upperRandomizer(string):
    return "".join([char.upper() if random.randint(0,1) == 0 else char for char in string])

print (upperRandomizer("HelloWorld"))

输出:

HeLLoWorlD

1
import random

upperRandomizer = lambda s: ''.join(random.choice((str.upper, str.lower))(x) for x in s)

for _ in range(5):
    print(upperRandomizer('HelloWorld'))

输出:

HELlOwORlD
hELlOWoRLd
HELlowORLd
HELLOwOrLd
HeLLoWorlD

0

冒着太多的魔法风险,我会做类似这样的事情:

from random import choice

def caseRandomizer(text):
    return ''.join(map(choice, zip(text.lower(), text.upper())))

i.e:

  1. 获取文本的小写和大写版本
  2. 使用 zip 逐个字符地迭代它们两个
  3. map(choice, ...) 随机选择小写或大写字符
  4. ''.join(...) 将迭代器转换回字符串

警告,我随后意识到这并不总是有效。例如,德语中称为 eszett 的小写字符 'ß' 在转换为大写时变成了 'SS',因此大小写版本可能会“失去同步”。

一个可行的版本是:

from random import choices

def caseRandomizer(text):
    return ''.join(fn(c) for (fn, c) in zip(choices((str.lower, str.upper), k=len(text)), text))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接