提示
将一根绳子变成过山车的情况。句子的第一个字母是大写,下一个小写,下一个大写,依此类推。
代码
with open('test.txt') as file:
for line in file:
words = line.split()
for word in words:
chars = list(word)
for index, char in enumerate(chars):
if index == 0:
print char.upper(),
elif is_even(index):
print char.upper(),
elif is_odd(index):
print char,
输入
Sunshine makes me happy, on a cloudy day
输出
S u N s H i N e M a K e S M e H a P p Y , O n A C l O u D y D a Y
这是我第一次尝试这个问题。除了按每个字母迭代之外,我想不出有任何其他方法可以做到这一点。当我这样做虽然我只是将整个句子视为一个字符串并喷出字符。
答案 0 :(得分:4)
您可以使用扩展切片大写每个第二个字母,每隔一个字母选择一次:
>>> sample = 'Sunshine makes me happy, on a cloudy day'
>>> sample[::2].upper()
'SNHN AE EHPY NACOD A'
>>> sample[1::2].lower()
'usiemksm ap,o luydy'
现在你需要做的就是把它们放在一起了:
from itertools import izip_longest
result = ''.join([l
for pair in izip_longest(sample[::2].upper(), sample[1::2].lower(), fillvalue='')
for l in pair])
izip_longest()
再次将大写和小写字符串配对,确保如果有一个奇数个字符用空字符串填充系列。
演示:
>>> from itertools import izip_longest
>>> ''.join([l
... for pair in izip_longest(sample[::2].upper(), sample[1::2].lower(), fillvalue='')
... for l in pair])
'SuNsHiNe mAkEs mE HaPpY, oN A ClOuDy dAy'
请注意,此处不会忽略空格;即使m
末尾的make
也是e
,Sunshine
的{{1}}也会小写。
如果你需要更精确地改变字母,你可以使用迭代:
from itertools import cycle
from operator import methodcaller
methods = cycle((methodcaller('upper'), methodcaller('lower')))
result = ''.join([next(methods)(c) if c.isalpha() else c for c in sample])
这里itertools.cycle()
让我们在两个operator.methodcaller()
objects之间交替,这两个next()
传入的参数大写或小写。当角色是一个时,我们只前进到下一个(使用{{3}})信件。
演示:
>>> from itertools import cycle
>>> from operator import methodcaller
>>> methods = cycle((methodcaller('upper'), methodcaller('lower')))
>>> ''.join([next(methods)(c) if c.isalpha() else c for c in sample])
'SuNsHiNe MaKeS mE hApPy, On A cLoUdY dAy'
答案 1 :(得分:1)
如果它的空白给你带来麻烦,你应该使用isalpha()
测试一个字符是否是一个字母。
with open('test.txt') as file:
for line in file:
newstr = ""
go_to_upper = True
for c in line:
if c.isalpha():
if go_to_upper:
newstr += c.upper()
else:
newstr += c.lower()
go_to_upper = not go_to_upper
else:
newstr += c
print newstr
输入:Sunshine makes me happy, on a cloudy day
输出:SuNsHiNe MaKeS mE hApPy, On A cLoUdY dAy
当有问题的字符是字母表中的字母时,您只能来回翻转(使用go_to_upper
布尔值)。否则,它会正常输出。请注意,MaKeS
以大写字母开头,但SuNsHiNe
以小写字母结尾,即使路上有空格。
此外,我们不是立即打印(这会给你带来奇怪的间距),而是将我们的字符放在一个新的列表中,我们将在以后打印出来。
答案 2 :(得分:0)
试试这段代码:
import re i = 1 with open('test.txt') as file: for line in file: words = line.split() for word in words: chars = list(word) for index, char in enumerate(chars): if re.compile('[a-zA-Z]').search(char): i+=1 if i%2 !=0: print char.upper(), else : print char.lower(),