如何给元组添加值?

95

我正在编写一个脚本,其中有一个元组列表,例如('1','2','3','4')

list = [('1','2','3','4'),
        ('2','3','4','5'),
        ('3','4','5','6'),
        ('4','5','6','7')]

现在我需要分别在每个元组结尾处添加 '1234''2345''3456''4567'。例如:

list = [('1','2','3','4','1234'),
        ('2','3','4','5','2345'),
        ('3','4','5','6','3456'),
        ('4','5','6','7','4567')]

有任何可能的方式吗?


3
在Python中,元组是不可变的。如果你想要“向元组添加内容”,为什么不从一开始就使用可变数据结构呢? - Felix Kling
2
我也这样做 - 最常用的是“file”,因为“for file in files”非常自然! - 但总的来说,你应该避免将列表称为“list”,因为它会替换内置的“list”。 - DSM
11个回答

169

元组是不可变的,不应该被改变 - 这就是列表类型存在的原因。

然而,你可以使用originalTuple + (newElement,)来替换每个元组,从而创建一个新的元组。例如:

t = (1,2,3)
t = t + (1,)
print(t)
(1,2,3,1)

但我建议从一开始就使用列表,因为它们更快地插入项目。

另一个提示:不要在程序中覆盖内置名称list,而是将变量称为l或其他名称。如果您覆盖了内置名称,则无法在当前范围内再次使用它。


25
速记 t += 1, - user1006989
2
非常好的观点,然而我处于不幸的情况,需要迭代地向 sqlite3 数据库添加值,并且需要将这些值制作成元组以添加(因为所需的语法是 VALUES (v1, v2, v3, ...))。在这种情况下,了解如何向元组中添加值非常有益。 - m13op22

17

根据语法判断,我猜这是Python。元组的重点在于它是不可变的,因此您需要用新元组替换每个元素:

list = [l + (''.join(l),) for l in list]
# output:
[('1', '2', '3', '4', '1234'), 
 ('2', '3', '4', '5', '2345'), 
 ('3', '4', '5', '6', '3456'), 
 ('4', '5', '6', '7', '4567')]

5
这个方法可以运行,但是真的应该这样做吗?我在想。因为这会违背最初使用元组的目的。或者我错了吗? - user225312

11

如其他答案所述,元组一旦创建就是不可变的,而列表可能更适合您的目的。

话虽如此,创建具有额外项目的新元组的另一个选项是使用展开运算符:

new_tuple = (*old_tuple, 'new', 'items')

我喜欢这个语法,因为它看起来像一个新元组,所以可以清楚地传达您想要做什么。

使用展开运算符,一个潜在的解决方案是:

list = [(*i, ''.join(i)) for i in list]


最具Python风格!这应该是最佳答案。 - JanLauGe

9

在Python中,你不能修改元组。因为元组是不可变的。

但是在包含元组的列表中,你可以用一个不同的元组 ('1', '2', '3', '4', '1234') 替换原先的元组 ('1', '2', '3', '4')


8

正如其他人已经回答的一样,在Python中,元组是不可变的,唯一的修改方式是创建一个包含附加元素的新元组。

但最好的解决方案是使用列表。当需要调用需要元组的任何函数或方法时,可以通过使用tuple(list)来创建元组。


5

我正在研究与元组(tuple)和列表(list)有关的一些细节,我的理解是:

  • 元组是异构(heterogeneous)集合数据类型
  • 元组有固定长度(每个元组类型)
  • 元组始终是有限的

因此,如果要向元组添加新项,则需要将其强制转换为list,并在其上执行append()操作,然后再次将其转换为元组。

但就个人而言,我对这个问题的感觉是,如果元组应该是有限的固定长度的项,如果我们在应用逻辑中使用这些数据类型,那么就不应该有向其中添加新项或更新项值的情况。 所以,它应该是列表的列表,我对吗?


1
有些情况下,你需要将元组传递给函数,比如在使用SQL(psycopg2)或与R(rpy2)交互时。如果给定列表而不是元组,函数不一定总是能正常工作。有时你也会从函数中接收到元组而不是列表。当你应该在列表的副本上工作时,元组可以防止错误地修改原始列表。因此,是的,无论是直接还是间接地,列表都是答案中的中介。然而,在许多情况下,最后转换回元组仍然是合乎逻辑的。 - Nate Wanner

2
很多人写元组是不可变的...这是正确的!但是有这段代码:
tuple = ()
for i in range(10):
    tuple += (i,)
print(tuple)

它起作用了!为什么?好吧...那是因为在代码中有一个"="。每次你在Python中使用运算符"="时,你都会给一个对象分配一个新值:你创建一个新变量!

所以你不是修改旧的元组:你正在创建一个新的元组,它的名称相同(tuple),其值为旧的元组加上一些其他东西。


2
    list_of_tuples = [('1', '2', '3', '4'),
                      ('2', '3', '4', '5'),
                      ('3', '4', '5', '6'),
                      ('4', '5', '6', '7')]


    def mod_tuples(list_of_tuples):
        for i in range(0, len(list_of_tuples)):
            addition = ''
            for x in list_of_tuples[i]:
                addition = addition + x
            list_of_tuples[i] = list_of_tuples[i] + (addition,)
        return list_of_tuples

    # check: 
    print mod_tuples(list_of_tuples)

0

对于元组和列表,一个非常简单的方法可以是(假设):

tpl = ( 3, 6, 9)
lst = [ 12, 15, 18]
my_tuple = tpl + tuple(lst)
print(my_tuple)

0
OUTPUTS = []
for number in range(len(list_of_tuples))):
    tup_ = list_of_tuples[number]
    list_ = list(tup_)  
    item_ = list_[0] + list_[1] + list_[2] + list_[3]
    list_.append(item_)
    OUTPUTS.append(tuple(list_))

输出就是你想要的


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接