列表中的元组不能直接更改?

时间:2015-03-06 21:06:54

标签: python list tuples

在线课程存在编程问题,需要我修改元组列表中的项目。奇怪,我知道。关于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)。

3 个答案:

答案 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关于如何做到这一点的答案。