在线课程存在编程问题,需要我修改元组列表中的项目。奇怪,我知道。关于Stack Overflow的一些其他问题,评论者注意到字典会更有意义。
但是,除了数据结构外,以下代码不起作用:
l = [(0, 'apples'), (1, 'pears'), (2, 'bananas')]
for item in l:
if item[0] == 1:
item = 'something else'
不。它保持完全相同。但是当我以不同的方式编写循环时,如:
for index in range(len(l)-1):
if l[index][0] == 1:
l[index] = 'what is this'
列表中的中间项已成功更改,即使它是元组。我不喜欢第二段代码;它似乎不必要地冗长。它不应该以任何方式工作吗?我正在考虑将此行为报告为Python中的错误(尝试了2.7和3.4)。
答案 0 :(得分:3)
items = [(0, 'apples'), (1, 'pears'), (2, 'bananas')]
print [item if item[0] != 1 else "something else" for item in items]
通常是如何在python
中执行此操作答案 1 :(得分:3)
如果你想更改inplace use enumerate not range:
l = [(0, 'apples'), (1, 'pears'), (2, 'bananas')]
for ind, tup in enumerate(l):
if tup[0] == 1:
l[ind] = "something else"
print(l)
或者您可以将l[:]
与列表理解结合使用来更改原始列表:
l[:] = ["something else" if tup[0] == 1 else tup for tup in l]
print(l)
或者使用生成器表达式:
l[:] = ("something else" if tup[0] == 1 else tup for tup in l)
print(l)
item = 'something else'
只是创建一个变量item
,实际为列表l[ind]
建立索引,并使用=
分配新值来更改列表中的项目。
如果列表中的中间项成功更改,即使它是一个元组,也就是预期的行为,那么您要更改列表中的元素而不是元素中的元素元组。如果您尝试索引元组并更新其中的值,那么它将是一个不同的故事,TypeError: 'tuple' object does not support item assignment
,因为元组是不可变的。
答案 2 :(得分:1)
这不是错误。
在第一个示例中,您将使用item = 'something else'
指定本地变量名称。 IE浏览器。 item
不再引用列表中的元组。这是一个新变量。
在第二个示例中,您将替换列表中的元素(这是可变的)。
请参阅Joran关于如何做到这一点的答案。