我正在编写一个脚本,其中有一个像
('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')]
有什么可能吗?
元组是不可变的,不应该被更改——这就是列表类型的用途。
但是,您可以使用
originalTuple + (newElement,)
替换每个元组,从而创建一个新元组。例如:
t = (1,2,3)
t = t + (1,)
print(t)
(1,2,3,1)
但我宁愿建议从一开始就使用列表,因为它们插入项目的速度更快。
还有另一个提示:不要覆盖程序中的内置名称
list
,而应调用变量 l
或其他名称。如果覆盖内置名称,则无法在当前范围内再使用它。
根据语法,我猜这是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')]
正如其他答案中提到的,元组一旦创建就是不可变的,列表可能会更好地满足您的目的。
也就是说,创建带有额外项目的新元组的另一种选择是使用 splat 运算符:
new_tuple = (*old_tuple, 'new', 'items')
我喜欢这种语法,因为它看起来像一个新元组,所以它清楚地传达了你想要做什么。
使用 splat,一个潜在的解决方案是:
list = [(*i, ''.join(i)) for i in list]
在 Python 中,你不能。元组是不可变的。
在包含列表中,您可以将元组
('1', '2', '3', '4')
替换为不同的 ('1', '2', '3', '4', '1234')
元组。
正如其他人所回答的,Python 中的元组是不可变的,“修改”元组的唯一方法是创建一个包含附加元素的新元组。
但最好的解决方案是一个列表。当需要调用任何需要元组的函数或方法时,使用 tuple(list) 创建一个元组。
我正在查看一些与
tuple
和list
相关的细节,我的理解是:
Heterogeneous
集合数据类型因此,要将新项目附加到元组,需要将其强制转换为
list
,并对其执行 append()
操作,然后再次将其强制转换回元组。
但我个人对这个问题的感受是,如果元组应该是有限、固定长度项,并且如果我们在应用程序逻辑中使用这些数据类型,那么应该不存在这样的情况:追加新项目或更新其中的项目值。 因此,它应该是 列表 本身,而不是 元组列表,我的说法正确吗?
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)
很多人都说元组是不可变的......这是正确的!但有这样的代码:
tuple = ()
for i in range(10):
tuple += (i,)
print(tuple)
而且它有效!为什么?嗯..那是因为代码中有一个“=”。每次在 Python 中使用运算符“=”时,都会为对象分配一个新值:创建一个新变量!
因此,您没有修改旧元组:您正在创建一个具有相同名称(元组)的新元组,其值是旧元组加上更多内容。
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_))
输出就是你想要的
tpl = ( 3, 6, 9)
lst = [ 12, 15, 18]
my_tuple = tpl + tuple(lst)
print(my_tuple)
您可以使用生成器,这样您就不必更改基础列表或存储新列表。在插入过程中动态创建它,这样您只需循环一次。
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()