在 python 中更改字符串

Mutating strings in python

提问人:Christian Barry 提问时间:5/16/2017 最后编辑:CommunityChristian Barry 更新时间:5/16/2017 访问量:12142

问:

我的大脑无法理解为什么这不起作用。我不是很有经验,只是想练习循环。

我正在尝试创建一个函数,该函数采用字符串(当前是一个单词)并随机将字母大写。使用此代码,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' 循环中访问索引我不是在尝试主动寻找索引,我只是在练习循环,这些循环巧合地按顺序遍历可迭代对象的索引。我还认为,如果一个菜鸟编码员正在搜索,这可能会更有帮助。

字符串 python-3.x 可变

评论

0赞 Cyclonecode 5/16/2017
在 Python 'for' 循环中访问索引的可能重复
2赞 tdelaney 5/16/2017
Python 有很多用于列表处理的工具。你可以用list(random.choice((str.upper, str.lower))(c) for c in string)

答:

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
在您的示例中,您仍然需要修改全局变量。第二次(第三次和...)会发生什么?hippycaselisthippycase
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]