这很可能是某种东西的重复,但我的说教失败了。
众所周知,元组是不可变的,所以您不能真正改变它们。然而,有时候,做一些事情会很方便,比如将(1, 2, "three")更改为(1, 2, 3),也许类似于Haskell record update syntax.,您实际上不会更改原始元组,但是您会得到一个新的元组,它只是在一个(或多个)元素上有所不同。
这样做的一种方法是:
elements = list(old_tuple)
elements[-1] = do_things_to(elements[-1])
new_tuple = tuple(elements)我觉得,将一个元组更改为一个列表--无论如何--这违背了old_tuple使用元组类型的目的:如果您使用的是一个列表,那么您就不必在每次操作的内存中构建一个丢弃的元组列表副本。
如果要更改元组的第三个元素,也可以这样做:
def update_third_element(a, b, c, *others):
c = do_things_to(c)
return tuple(a, b, c, *others)
new_tuple = update_third_element(*old_tuple)这将比天真的方法更好地抵抗元组中元素数量的变化:
a, b, c, d, e, f, g, h, i, j = old_tuple
c = do_things_to(c)
new_tuple = (a, b, c, d, e, f, g, h, j, j) # whoops如果您想要更改的是最后一个元素,或者是n到...but元素,那么它就不能工作。它还创建了一个丢弃列表(others)。它也迫使你将所有元素命名为n。
有更好的办法吗?
发布于 2014-04-27 21:58:21
我会使用collections.namedtuple来代替:
>>> from collections import namedtuple
>>> class Foo(namedtuple("Foo", ["a", "b", "c"])):
pass
>>> f = Foo(1, 2, 3) # or Foo(a=1, b=2, c=3)
>>> f._replace(a = 5)
Foo(a=5, b=2, c=3)namedtuple还支持索引,因此您可以使用它们来代替普通的元组。
如果必须使用普通元组,只需使用助手函数:
>>> def updated(tpl, i, val):
return tpl[:i] + (val,) + tpl[i + 1:]
>>> tpl = (1, 2, 3)
>>> updated(tpl, 1, 5)
(1, 5, 3)https://stackoverflow.com/questions/23329525
复制相似问题