如何为元组添加值?

问题描述 投票:0回答:11

我正在编写一个脚本,其中有一个像

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

有什么可能吗?

python tuples
11个回答
169
投票

元组是不可变的,不应该被更改——这就是列表类型的用途。

但是,您可以使用

originalTuple + (newElement,)
替换每个元组,从而创建一个新元组。例如:

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

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

还有另一个提示:不要覆盖程序中的内置名称

list
,而应调用变量
l
或其他名称。如果覆盖内置名称,则无法在当前范围内再使用它。


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

11
投票

正如其他答案中提到的,元组一旦创建就是不可变的,列表可能会更好地满足您的目的。

也就是说,创建带有额外项目的新元组的另一种选择是使用 splat 运算符:

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

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

使用 splat,一个潜在的解决方案是:

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


9
投票

在 Python 中,你不能。元组是不可变的。

在包含列表中,您可以将元组

('1', '2', '3', '4')
替换为不同的
('1', '2', '3', '4', '1234')
元组。


8
投票

正如其他人所回答的,Python 中的元组是不可变的,“修改”元组的唯一方法是创建一个包含附加元素的新元组。

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


5
投票

我正在查看一些与

tuple
list
相关的细节,我的理解是:

  • 元组是
    Heterogeneous
    集合数据类型
  • 元组具有 固定长度(每个元组类型)
  • 元组总是有限的

因此,要将新项目附加到元组,需要将其强制转换为

list
,并对其执行
append()
操作,然后再次将其强制转换回元组。

但我个人对这个问题的感受是,如果元组应该是有限固定长度项,并且如果我们在应用程序逻辑中使用这些数据类型,那么应该存在这样的情况:追加新项目或更新其中的项目值。 因此,它应该是 列表 本身,而不是 元组列表,我的说法正确吗?


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)

2
投票

很多人都说元组是不可变的......这是正确的!但有这样的代码:

tuple = ()
for i in range(10):
    tuple += (i,)
print(tuple)

而且它有效!为什么?嗯..那是因为代码中有一个“=”。每次在 Python 中使用运算符“=”时,都会为对象分配一个新值:创建一个新变量!

因此,您没有修改旧元组:您正在创建一个具有相同名称(元组)的新元组,其值是旧元组加上更多内容。


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

输出就是你想要的


0
投票

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

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

0
投票

您可以使用生成器,这样您就不必更改基础列表或存储新列表。在插入过程中动态创建它,这样您只需循环一次。

def my_generator(old_list: list, new_values: tuple):
    for idx, row in enumerate(old_list):
        new_row: list = list(row)

        new_row.append(new_values[idx])

        new_dataset: tuple = tuple(new_row)

        yield new_dataset

def make_sql():
    my_list: list = [
        ('1', '2', '3', '4'),
        ('2', '3', '4', '5'),
        ('3', '4', '5', '6'),
        ('4', '5', '6', '7')
    ]

    my_var: tuple = ('1234', '2345', '3456', '4567')

    my_new_list = my_generator(my_list, my_var)

    'I like SQL Injection attacks!'

    for row in my_new_list:
        print(
            'INSERT INTO users (V1, V2, V3, V4) '
            f'VALUES {row};'
        )


if __name__ == '__main__':
    make_sql()
© www.soinside.com 2019 - 2024. All rights reserved.