首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是“改变”元组元素的优雅方法?

什么是“改变”元组元素的优雅方法?
EN

Stack Overflow用户
提问于 2014-04-27 21:54:53
回答 1查看 2.6K关注 0票数 3

这很可能是某种东西的重复,但我的说教失败了。

众所周知,元组是不可变的,所以您不能真正改变它们。然而,有时候,做一些事情会很方便,比如将(1, 2, "three")更改为(1, 2, 3),也许类似于Haskell record update syntax.,您实际上不会更改原始元组,但是您会得到一个新的元组,它只是在一个(或多个)元素上有所不同。

这样做的一种方法是:

代码语言:javascript
复制
elements = list(old_tuple)
elements[-1] = do_things_to(elements[-1])
new_tuple = tuple(elements)

我觉得,将一个元组更改为一个列表--无论如何--这违背了old_tuple使用元组类型的目的:如果您使用的是一个列表,那么您就不必在每次操作的内存中构建一个丢弃的元组列表副本。

如果要更改元组的第三个元素,也可以这样做:

代码语言:javascript
复制
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)

这将比天真的方法更好地抵抗元组中元素数量的变化:

代码语言:javascript
复制
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。

有更好的办法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-27 21:58:21

我会使用collections.namedtuple来代替:

代码语言:javascript
复制
>>> 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还支持索引,因此您可以使用它们来代替普通的元组。

如果必须使用普通元组,只需使用助手函数:

代码语言:javascript
复制
>>> def updated(tpl, i, val):
        return tpl[:i] + (val,) + tpl[i + 1:]

>>> tpl = (1, 2, 3)
>>> updated(tpl, 1, 5)
(1, 5, 3)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23329525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档