提问人:Christian Barry 提问时间:5/16/2017 最后编辑:CommunityChristian Barry 更新时间:5/16/2017 访问量:12142
在 python 中更改字符串
Mutating strings in python
问:
我的大脑无法理解为什么这不起作用。我不是很有经验,只是想练习循环。
我正在尝试创建一个函数,该函数采用字符串(当前是一个单词)并随机将字母大写。使用此代码,python 会抛出 TypeError:列表索引必须是整数或切片,而不是字符串
这是我所拥有的:
import random
list = []
def hippycase(string):
for letter in string:
list.append(letter)
for index in list:
if random.randint(1,2) == 1:
list[index] = list[index].upper()
else:
list[index] = list[index].lower()
return list
print(hippycase("pineapple"))
有什么想法或技巧吗?谢谢
编辑:由于这已被标记为重复,因为有人认为在以下链接中,我将尝试澄清不同之处:在 Python 'for' 循环中访问索引我不是在尝试主动寻找索引,我只是在练习循环,这些循环巧合地按顺序遍历可迭代对象的索引。我还认为,如果一个菜鸟编码员正在搜索,这可能会更有帮助。
答:
2赞
Ajax1234
5/16/2017
#1
您正在使用的变量“index”是字符串中的一个字母,因为您正在循环访问它。要修复此错误,请使用 range() 函数,该函数将允许您按索引访问列表中的每个元素:
list = []
def hippycase(string):
for letter in string:
list.append(letter)
for index in range(len(list)): #here, we are accessing the elements by index
if random.randint(1,2) == 1:
list[index] = list[index].upper()
else:
list[index] = list[index].lower()
return list
print(hippycase("pineapple"))
另一种方法是简单的列表推导:
the_string = "pineapple"
print ''.join([i.upper() if random.randint(1, 2) == 1 else i for i in the_string])
评论
0赞
donkopotamus
5/16/2017
在您的示例中,您仍然需要修改全局变量。第二次(第三次和...)会发生什么?hippycase
list
hippycase
0赞
Christian Barry
5/16/2017
在谷歌搜索范围函数后,我想我明白了发生了什么。我缺乏知识将导致我患上动脉瘤。感谢您的帮助!
0赞
Ajax1234
5/16/2017
当然,“list”仍然会存储从函数附加到它的所有变量,但是在这个问题的上下文中,以及 OP 专门调用函数一次的事实,我没有在代码中修复它。
0赞
Ajax1234
5/16/2017
我很高兴我能帮上忙!
2赞
Jon Kiparsky
5/16/2017
#2
下面是代码的略微改进版本
def hippycase(string):
charlist = []
for char in string:
if random.randint(1,2) == 1:
charlist.append(char.upper())
else:
charlist.append(char.lower())
return charlist
请注意,在此版本中,我们只查看字符串中的字符,我们不关心索引 - 这有助于减少混淆。
如果我写这个来实际“嬉皮士”一个字符串,我可能会返回“”.join(charlist),所以调用函数会返回一个字符串(这是他们可能期望的)
此外,覆盖保留字也是一种不好的做法。list
评论
0赞
Davichete
11/28/2019
带有理解列表的改进版本[char.upper() if random.randint(1, 2) == 1 else char.lower() for char in string]
评论
list(random.choice((str.upper, str.lower))(c) for c in string)