生成元组的修改副本

时间:2016-09-21 19:54:44

标签: python tuples immutability

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

但是想知道是否有一些pythonic方法通过隐式创建一个像

这样的新元组来“修改”一个元组
>>> source_tuple = ('this', 'is', 'the', 'old', 'tuple')
>>> new_tuple = source_tuple.replace(3, 'new')
>>> new_tuple
('this', 'is', 'the', 'new', 'tuple')

可能的实现可能如下所示,但我正在寻找内置解决方案:

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()

实现这样的功能并不是很多工作,但像Enum已经证明,有时每个人都使用一个实现更好。

修改:我的目标是而不是来替换源元组。我知道我可以使用列表但是在这种情况下我会先复制一份。所以我真的只是想找到一种方法来创建一个修改过的副本。

4 个答案:

答案 0 :(得分:2)

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

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

然后您可以支持列表或元组,如下所示:

>>> 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)

或者,直接在列表中进行:

>>> 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')

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

答案 1 :(得分:2)

如果您正在考虑动态交换值,那么<!doctype html> <html> <head> <meta charset="utf-8"> <title>My crappy Google</title> <meta name="author" content="n00b"> </head> <body> <button class="loginbutton">Login</button> <div id="Search"> <div class="holder"> <img src="https://www.google.at/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png" alt="Google Logo" width="75% of window"> </div> <div class "box"> <input type="text" name="search" placeholder="Search...."> </div> <div> <button class="gbutton1">Google-search</button> <button class="gbutton2">i´m feeeling like crap</button> </div> <div class="footer">footer</div> </body> </html>是更合适的数据结构;因为我们已经知道元组是不可变的

另外请注意,如果您在list中查找交换值逻辑,则可以查看collections.namedtuple,其{{1}方法。

  

它们可以在使用常规元组的任何地方使用

tuple

那看起来不太优雅。我仍然建议你改用_replace

答案 2 :(得分:0)

你可以使用某种理解:

source_tuple = ('this', 'is', 'the', 'old', 'tuple')
new_tuple = tuple((value if x != 3 else 'new'
                   for x, value in enumerate(source_tuple)))
# ('this', 'is', 'the', 'new', 'tuple')

在这种情况下,这是相当愚蠢的,但是让您了解一般概念。不过最好使用列表,毕竟,您可以在此处更改基于索引的值。

答案 3 :(得分:0)

如果您需要使用替换元素创建新元组,您可以使用以下内容:

def replace_value_in_tuple(t, ind, value):
    return tuple(
        map(lambda i: value if i == ind else t[i], range(len(t)))
    )