Another alternating-case in-a-string in Python 3.+

女生的网名这么多〃 提交于 2019-12-02 06:22:42

Here is a cutesie way to do this:

>>> s = "This is harder than I thought it would be"
>>> from itertools import cycle
>>> funcs = cycle([str.upper, str.lower])
>>> ''.join(next(funcs)(c) for c in s if c != ' ')
'ThIsIsHaRdErThAnItHoUgHtItWoUlDbE'
>>>

Or, as suggested by Moses in the comments, you can use str.isspace, which will take care of not just a single space ' '

>>> ''.join(next(funcs)(c) for c in s if not c.isspace())
'ThIsIsHaRdErThAnItHoUgHtItWoUlDbE'

This approach only does a single pass on the string. Although, a two-pass method is likely performant enough.

Now, if you were starting with a nospace string, the best way is to convert to some mutable type (e.g. a list) and use slice-assignment notation. It's a little bit inefficient because it builds intermediate data structures, but slicing is fast in Python, so it may be quite performant. You have to ''.join at the end, to bring it back to a string:

>>> nospace
'ThisisharderthanIthoughtitwouldbe'
>>> nospace = list(nospace)
>>> nospace[0::2] = map(str.upper, nospace[0::2])
>>> nospace[1::2] = map(str.lower, nospace[1::2])
>>> ''.join(nospace)
'ThIsIsHaRdErThAnItHoUgHtItWoUlDbE'
>>>
zmbq

You're trying to do everything at once. Don't. Break your program into steps.

  1. Read the string.
  2. Remove the spaces from the string (as @A.Sherif just demonstrated here)
  3. Go over the string character by character. If the character is in an odd position, convert it to uppercase. Otherwise, convert to lowercase.
Alec C

So your 2nd loop is where you're breaking it, because the original list isn't being shortened, the c=nospace[:1] grabs the first character of the string and that's the only character that's ever printed. So a solution would be as follows.

string1 = str(input("Ask user for something."))

nospace = ''.join(string1.split(' '))

for i in range(0, len(nospace)):
    if i % 2 == 0:
        print(nospace[i].upper(), end="")
    else:
        print(nospace[i].lower(), end="")

Could also replace the if/else statement with a ternary opperator.

for i in range(0, len(nospace)):
    print(nospace[i].upper() if (i % 2 == 0) else nospace[i].lower(), end='')

Final way using enumerate as commented about

for i, c in enumerate(nospace):
    print(c.upper() if (i % 2 == 0) else c.lower(), end='')
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!