如何为元组增加价值?


79

我正在编写一个脚本,其中有一个类似的元组列表('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')]

有可能吗?


8
跨语言解决方案?;)
Snowbear 2011年

2
欢迎来到StackOverflow!当您问问题时,右边有一个方便的“如何格式化”框。值得一读,从问题区域上方的[?]链接的页面也是如此。
TJ Crowder'2

3
至少在Python中,元组是不可变的。如果要“向元组添加内容”,为什么不从一开始就使用可变数据结构?
菲利克斯·克林

2
我也这样做-通常是使用“文件”,因为“用于文件中的文件”是如此的自然!-但总的来说,您可能应该避免将列表称为“列表”,以取代内置的“列表”。
DSM

Answers:


136

元组是不可变的,不应更改-这就是列表类型的目的。您可以将每个元组替换为originalTuple + (newElement,),从而创建一个新的元组。例如:

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

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

还有一个提示:不要覆盖程序中的内置名称list,而是调用变量l或其他名称。如果覆盖内置名称,则无法在当前作用域中使用它。


23
速记t += 1,

1
优缺点是,我很不幸在这种情况下,我想将值迭代地添加到sqlite3数据库中,并且需要对要添加的值进行元组化(因为所需的语法是VALUES (v1, v2, v3, ...)。在这种情况下,知道如何将值添加到数据库中)。元组是非常有益的。
HS-星云

16

基于语法,我猜这是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 2011年

9

在Python中,您不能这样做。元组是不可变的。

在包含列表中,您可以将元组替换('1', '2', '3', '4')为其他('1', '2', '3', '4', '1234')元组。


8

如其他答案中所述,元组一旦创建便是不可变的,并且列表可能会更好地满足您的目的。

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

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

我喜欢这种语法,因为它看起来像一个新的元组,因此可以清楚地传达您要执行的操作。

使用splat,可能的解决方案是:

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


7

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

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


4

我正在查看与tuple和相关的一些细节list,据了解,是:

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

因此,要将新项目追加到元组,需要将其强制转换为list,并对其进行append()操作,然后再次将其强制强制转换为元组。

但我个人是什么,我觉得这样一个问题,如果元组应该是有限的固定长度的东西,如果我们在我们的应用程序逻辑使用这些数据类型的话,应该不会是追加新项目或更新中的一个项目价值的情景它。因此,而不是元组的名单应该是列表的列表本身这一点,我说得对不对?


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

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

输出就是你想要的

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.