Python 将字符串中的随机字符转换为大写

Python 将字符串中的随机字符转换为大写,python,Python,我尝试随机添加文本字符串,这样就不需要像这样的输出了 >>>david 我最终会吃到像这样的东西 >>>DaViD >>>dAviD >>>jOhN01361 >>>john01361 >>>JOHN01361 >>>JoHn01361 我现在掌握的代码是 import random import string print "Name Year" text_fil

我尝试随机添加文本字符串,这样就不需要像这样的输出了

>>>david
我最终会吃到像这样的东西

>>>DaViD
>>>dAviD
>>>jOhN01361
>>>john01361
>>>JOHN01361
>>>JoHn01361
我现在掌握的代码是

import random
import string

print "Name Year"
text_file = open("names.txt", "r")
for line in text_file:
    print line.strip()+"".join([random.choice(string.digits) for x in range(1, random.randint(1,9))])
它超越了这一点

>>>JOHN01361
我想让那根绳子看起来像

>>>DaViD
>>>dAviD
>>>jOhN01361
>>>john01361
>>>JOHN01361
>>>JoHn01361

好的,您的规范实际上是随机使用大写字符,如果您愿意,您可以通过以下列表理解来实现这一点:

import random

s = "..."
s = "".join( random.choice([k.upper(), k ]) for k in s )

但是可能有更好的方法…

您可能想做以下事情:

import random

lol = "lol apples"

def randomupper(c):
    if random.random() > 0.5:
        return c.upper()
    return c.lower()

lol =''.join(map(randomupper, lol))

编辑:

正如Shawn Chin在评论中指出的,这可以简化为:

lol=”“.join((c.upper(),c)[random()>0.5]表示lol中的c)

非常酷,但是比使用
map


编辑2:

运行一些计时器测试,似乎
“”.join(随机的.choice([k.upper(),k])表示s中的k)

比map方法慢5倍以上,有人能确认吗?
时间是:

no map:        5.922078471303955
map:           4.248832001003303
random.choice: 25.282491881882898

以下内容可能比Nook的解决方案略为有效,而且它不依赖于以小写字母开头的文本:

import random
txt = 'JOHN01361'
''.join(random.choice((x,y)) for x,y in zip(txt.upper(),txt.lower()))

为不同的实现计时只是为了好玩:

#!/usr/bin/env python

import random

def f1(s):
    return ''.join(random.choice([x.upper(), x]) for x in s)

def f2(s):
    return ''.join((x.upper(), x)[random.randint(0, 1)] for x in s)

def f3(s):
    def randupper(c):
        return random.random() > 0.5 and c.upper() or c

    return ''.join(map(randupper, s))

def f4(s):
    return ''.join(random.random() > 0.5 and x.upper() or x for x in s)

if __name__ == '__main__':
    import timeit
    timethis = ['f1', 'f2', 'f3', 'f4']
    s = 'habia una vez... truz'
    for f in timethis:
        print '%s: %s' % (f,
                          timeit.repeat('%s(s)' % f, 'from __main__ import %s, s' % f,
                                        repeat=5, number=1000))
这是我的时代:

f1: [0.12144303321838379, 0.13189697265625, 0.13808107376098633, 0.11335396766662598, 0.11961007118225098]
f2: [0.22459602355957031, 0.23735499382019043, 0.19971895217895508, 0.2097780704498291, 0.22068285942077637]
f3: [0.044358015060424805, 0.051508903503417969, 0.045358896255493164, 0.047426939010620117, 0.042778968811035156]
f4: [0.04383397102355957, 0.039394140243530273, 0.039273977279663086, 0.045912027359008789, 0.039510011672973633]

k.upper()如果是random.choice([True,False]),则k
是不必要的复杂。只需使用
random.choice([k.upper(),k])
:)Cleaner,我同意:)(已更改)。卡尔建议使用
random.choice([k.upper(),k])
在我看来更优雅。如果我按照你的方式做,我会使用lambda:
'.join(map(lambda c:random.random()>0.5和c.upper()或c,lol))
。我尽量避免使用
lambda
,特别是在
map
中,因为它的性能很差,他的解决方案非常优雅,但是,如果我希望有更少/更多的上限,我喜欢有改变比率的选项。可以在没有map或lambda的情况下编写:
“”。join((c.upper(),c)[random()>0.5]表示lol中的c)
@ShawnChin哦,哇,我想那句话只在lambdas中起作用,谢谢你的评论,知道这是件好事。