用索引替换python列表中的项目..失败?

时间:2013-06-04 10:54:53

标签: python list python-2.7 indexing

在我打电话时知道为什么:

>>> hi = [1, 2]
>>> hi[1]=3
>>> print hi
[1, 3]

我可以通过索引更新列表项,但是当我调用时:

>>> phrase = "hello"
>>> for item in "123":
>>>     list(phrase)[int(item)] = list(phrase)[int(item)].upper()
>>> print phrase
hello

失败了?

应为hELLo

5 个答案:

答案 0 :(得分:8)

您尚未将phrase(您打算制作的list)初始化为变量。所以你几乎已经在每个循环中创建了一个列表,它完全相同。

如果您打算实际更改phrase的字符,那么这是不可能的,就像在python中一样,字符串是不可变的。

也许make phraselist = list(phrase),然后编辑for循环中的列表。此外,您可以使用range()

>>> phrase = "hello"
>>> phraselist = list(phrase)
>>> for i in range(1,4):
...     phraselist[i] = phraselist[i].upper()
... 
>>> print ''.join(phraselist)
hELLo

答案 1 :(得分:3)

>>> phrase = "hello"
>>> list_phrase = list(phrase)
>>> for index in (1, 2, 3):
        list_phrase[index] = phrase[index].upper()
>>> ''.join(list_phrase)
'hELLo'

如果您更喜欢单行:

>>> ''.join(x.upper() if index in (1, 2, 3) else x for
            index, x in enumerate(phrase))
'hELLo'

答案 2 :(得分:1)

另一个答案,只是为了好玩:)

phrase = 'hello'
func = lambda x: x[1].upper() if str(x[0]) in '123' else x[1]
print ''.join(map(func, enumerate(phrase)))
# hELLo

为了使这个健壮,我创建了一个方法:(因为我很棒,很无聊)

def method(phrase, indexes):
    func = lambda x: x[1].upper() if str(x[0]) in indexes else x[1]
    return ''.join(map(func, enumerate(phrase)))

print method('hello', '123')
# hELLo

答案 3 :(得分:0)

认为字符串在python中是不可变的你不能修改现有的字符串可以创建新的。

''.join([c if i not in (1, 2, 3) else c.upper() for i, c in enumerate(phrase)])

答案 4 :(得分:0)

list()创建列表。你的循环创建并立即丢弃每次迭代的两个新列表。你可以把它写成:

phrase = "hello"
L = list(phrase)
L[1:4] = phrase[1:4].upper()
print("".join(L))

或没有清单:

print("".join([phrase[:1], phrase[1:4].upper(), phrase[4:]]))

字符串在Python中是不可变的,因此要更改它,您需要创建一个新字符串。

或者如果你正在处理字节串,你可以使用可变的bytearray

phrase = bytearray(b"hello")
phrase[1:4] = phrase[1:4].upper()
print(phrase.decode())

如果索引不连续;你可以使用一个明确的for循环:

indexes = [1, 2, 4]
for i in indexes:
    L[i] = L[i].upper()