知道为什么当我打电话时:
>>> 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
知道为什么当我打电话时:
>>> 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
您尚未将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
>>> 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'
另一个答案,只是为了好玩:)
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
考虑字符串在python中是不可变的你不能修改现有的字符串可以创建新的。
''.join([c if i not in (1, 2, 3) else c.upper() for i, c in enumerate(phrase)])
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()