我是Python的新手,我正在尝试理解如何操纵字符串。
我想要做的是通过删除空格并将案例从上到下交替来改变字符串,IE“这比我想象的要难”到“ThIsIsHaRdErThAnItHoUgHtItWoUlDbE”
我拼凑了一个代码来删除空格(从这里大量借用):
string1 = input("Ask user for something.")
nospace = ""
for a in string1:
if a == " ":
pass
else:
nospace=nospace+a
......但是我无法绕过帽子/小写部分。在这个网站上有几个类似的问题,我已经尝试修改其中一些,没有任何乐趣。我意识到我需要定义一个范围并迭代它,但这就是我画一个空白的地方。
for c in nospace[::]:
d = ""
c = nospace[:1].lower()
d = d + c
c = nospace[:1].upper
print d
我所得到的只是一个V列。我显然错了。有人可以建议在哪里?提前谢谢。
答案 0 :(得分:2)
这是一种可爱的方式:
>>> 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'
>>>
或者,正如摩西在评论中所建议的那样,您可以使用str.isspace
,它不仅可以处理单个空格' '
>>> ''.join(next(funcs)(c) for c in s if not c.isspace())
'ThIsIsHaRdErThAnItHoUgHtItWoUlDbE'
这种方法只对字符串进行一次传递。虽然,两遍法可能足够高效。
现在,如果您使用nospace
字符串开头,最好的方法是转换为某种可变类型(例如list
)并使用切片分配表示法。它有点低效,因为它构建了中间数据结构,但在Python中切片是 fast ,所以它可能非常高效。最后你必须''.join
,把它带回一个字符串:
>>> 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'
>>>
答案 1 :(得分:0)
所以你的第二个循环是你打破它的地方,因为原始列表没有被缩短,c = nospace [:1]抓住字符串的第一个字符,这是唯一一个打印过的字符。所以解决方案如下。
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="")
还可以用ternary opperator替换if / else语句。
for i in range(0, len(nospace)):
print(nospace[i].upper() if (i % 2 == 0) else nospace[i].lower(), end='')
使用枚举作为评论
的最终方式for i, c in enumerate(nospace):
print(c.upper() if (i % 2 == 0) else c.lower(), end='')
答案 2 :(得分:0)
你正试图一次做所有事情。别。将您的计划分解为步骤。