2012-05-05 36 views
16

假设我有一个列表:串联元组

a=[1,2,3,4,5] 

现在我想这个列表转换成一个元组。我认为这样的编码会这样做:

state=() 
for i in a: 
    state=state+i 

它给出了一个错误。这很明显,为什么,我试图连接一个整数与一个元组。

但元组的功能与列表不同,比如插入或追加。 那么如何通过循环添加元素?与字典一样,我感觉好像缺少了一个链接。

+2

元组(a)有什么不好? – joaquin

+0

nothings坏..我想有更多的控制列表,以便我可以动态地添加数据,当我想要...使用元组(a)会给(1,2,3,4,5)如果我想要在同一个列表中添加6,7,8,9,0 ...我想要一个通用的解决方案 – user784530

+1

如果你想编辑它,一个元组不是你的答案,只是使用一个列表。一个元组的确切点是一个不可变的列表。 – Josiah

回答

42

元组是不可变的,你不能追加,删除或编辑它们。如果你想要把一个列表转换成一个元组,你可以使用元组函数:

tuple(a) 

如果由于某种原因,你觉得有必要追加到一个元组(你永远不应该这样做),你随时可以把它放回列表,追加,然后把它放回一个元组:

tuple(list(a)+b) 

也能收到票,这就意味着人们一直看到它,所以时间更新和删除误传。

将元素添加到元组是可以的(排序)。这是一个愚蠢的事情要说。元组仍然是不变的,你不能编辑它们,但是你可以通过将多个元组放在一起来创建看起来像你一样的新元组。 tuple(list(a)+b)是愚蠢的,不要那样做。只是做tuple1 + tuple2,因为Python不吸。对于提供的代码,你会想要:

state =() 
for i in a: 
    state += (i,) 

保罗对这个答案的回应是比这个答案更正确的方式。

现在我可以停止对此感到不好。

+22

“你永远不应该这样做”可能不是有用的建议,因为你*不能附加到元组:),但是生成一个新的元组常常是有用的,元素添加。另外,在第二个例子中没有必要将'a'变成'list';如果b是要添加的元素而不是可迭代的,它应该只是'a +元组(b)'或'a +(b,)'。 –

+0

@thepaul感谢您的语法。我认为'b,+ a'会起作用,但它不会 - 这就是为什么我在这个页面上结束了。括号在这种情况下是需要的,因为你有它:'(b,)+ a'。然而,当b是一个整数时试图做'元组(b)'会产生错误''int'对象不可迭代。我正在使用Python 2.7.8。 – spinup

+0

@thepaul(1,2)+(3,)'做了诡计! – nmz787

3
>>> a = [1,2,3,4,5] 
>>> tuple(a) 
(1, 2, 3, 4, 5) 
+0

ok ..有点像套...使用循环 – user784530

+0

OP明确写道,这不是他的选择。 – runlevel0

1

元组在python中是不可变的。

所以在你用元组(...)初始化之后,它不能被修改。

a = [1,2,3,4,5] 
tuple(a) 
+0

但是你可以连接两个元组并重新分配结果给持有元组的变量,所以你仍然可以增量构建一个元组,就像在byron或Josia的答案中一样。但问题是这是否是一种有效的方法,因为解释器可能会为您创建的每个元组分配新的内存,而如果您在列表中操作则不会这样做。 – HelloGoodbye

8
state=() 
for i in a: 
    state=state+(i,) 

上面的代码将计算出每次新tuple (i,)成元组状态来连接。

我正在使用python 2.7.9。

2

只是一种PRECIS的:(2,)实际上是相同的tuple([2])所以你可以写:

>>>(2,) + tuple([2,3]) 
(2, 2, 3) 
>>> tuple([2]) + (2,3) 
(2, 2, 3) 
>>> tuple([2]) + tuple([2,3]) 
(2, 2, 3) 

蟒蛇的确是

1

如果你想有一个通用的解决方案非常柔顺,只是建立一个新的列表然后在完成后将其转换为元组。

您可以使用Josia和Byron的答案中提供的解决方案逐步构建您的元组,但这将为每次迭代创建一个新元组,如果您要转换的列表很大,因为解释器将不得不将所有元素从旧元组复制到新元组,每次迭代都需要O(n^2)次操作。

这不会列出发生,因为蟒蛇实际上比分配到需要的只是存储列表中的元素内存,以防万一你追加。那么,至少这是没有必要的,直到内存用完,python必须分配更多的内存。然后它会分配一大块内存并将所有元素移到新位置,但是这个新内存再次大于存储列表元素所需的内存。以这种方式建立一个列表只需要O(n)操作,因此更喜欢。

0

为构建C/NN灵活的张量形状类似的问题后,我觉得我建这个问题最普遍的解决方案:

def cat(*args): 
    x =() 
    for a in args: 
    if type(a) is tuple: 
     x+=a 
    elif type(a) in {list,numpy.ndarray}: 
     x+=tuple(a) 
    else: 
     x+=(a,) 
    return tuple(x) 

演示:

In [0]: cat(1,(1,2),(3,4),[1,2],2) 
Out[0]: (1, 1, 2, 3, 4, 1, 2) 

不知道这是不好的蟒蛇,我是新的:)