在函数中使用空格和字符串时遇到问题

时间:2014-09-02 15:36:57

标签: python string algorithm

提示

  

将一根绳子变成过山车的情况。句子的第一个字母是大写,下一个小写,下一个大写,依此类推。

代码

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

这是我第一次尝试这个问题。除了按每个字母迭代之外,我想不出有任何其他方法可以做到这一点。当我这样做虽然我只是将整个句子视为一个字符串并喷出字符。

3 个答案:

答案 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也是eSunshine的{​​{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(),