生成元组的修改副本

fra*_*ans 4 python tuples immutability

我知道我无法修改元组,而且我已经看到了从另一个像这里手动连接原始部分的元组创建元组的方法。

但是想知道是否已经出现了一些通过隐式创建一个新元组来“修改”元组的pythonic方法

>>> source_tuple = ('this', 'is', 'the', 'old', 'tuple')
>>> new_tuple = source_tuple.replace(3, 'new')
>>> new_tuple
('this', 'is', 'the', 'new', 'tuple')
Run Code Online (Sandbox Code Playgroud)

一个可能的实现看起来像这样,但我正在寻找一个内置的解决方案:

def replace_at(source, index, value):
    if isinstance(source, tuple):
        return source[:index] + (value,) + source[index + 1:]
    elif isinstance(source, list):
        return source[:index] + [value,] + source[index + 1:]
    else:
        explode()
Run Code Online (Sandbox Code Playgroud)

实现这样的功能并没有太多工作,但是就像Enum已经证明的那样,有时每个人都使用的实现会更好..

编辑:我的目标不是替换源元组。我知道我可以使用列表,但即使在这种情况下,我也会先复制一份。所以我真的只是在寻找一种方法来创建修改后的副本。

daw*_*awg 6


您可以在元组上使用切片(产生一个新元组)并连接:

>>> x=3
>>> new_tuple=source_tuple[0:x]+('new',)+source_tuple[x+1:]
>>> new_tuple
('this', 'is', 'the', 'new', 'tuple')
Run Code Online (Sandbox Code Playgroud)

然后您可以像这样支持列表或元组:

>>> def replace_at(source, index, value):
...     return source[0:index]+type(source)((value,))+source[index+1:]
...
>>> replace_at([1,2,3],1,'new')
[1, 'new', 3]
>>> replace_at((1,2,3),1,'new')
(1, 'new', 3)
Run Code Online (Sandbox Code Playgroud)

或者,直接在列表上执行:

>>> source_tuple = ('this', 'is', 'the', 'old', 'tuple')
>>> li=list(source_tuple)
>>> li[3]='new'
>>> new_tuple=tuple(li)
>>> new_tuple
('this', 'is', 'the', 'new', 'tuple')
Run Code Online (Sandbox Code Playgroud)

正如评论中所述——这就是列表的用途......