2012-05-05 12 views
16

Supongamos que tengo una lista:Concatenación Tupla

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

Ahora quiero convertir esta lista en una tupla. Pensé que la codificación de algo como esto sería:

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

y dio un error. Es bastante obvio por qué, I soy tratando de concatenar un número entero con una tupla.

Pero las tuplas no tienen las mismas funciones que las listas, como insertar o anexar. Entonces, ¿cómo puedo agregar elementos a través de bucle? Lo mismo con los diccionarios, siento que tengo un eslabón perdido.

+2

¿Qué hay de malo con la tupla (a)? – joaquin

+0

nada mal ... quería tener más control sobre la lista para que pueda agregar datos dinámicamente cuando quiera ... usar tuple (a) daría (1,2,3,4,5) lo que si quiero para agregar 6,7,8,9,0 en la misma lista ... quería una solución generalizada – user784530

+1

Si desea editarla, una tupla no es su respuesta, solo use una lista. El punto exacto de una tupla es ser una lista inmutable. – Josiah

Respuesta

42

Las tuplas son inmutables, no se puede añadir, eliminar o modificar en absoluto. Si desea convertir una lista en una tupla, sólo puede utilizar la función de tupla:

tuple(a) 

Si, por alguna razón, se siente la necesidad de anexar a una tupla (Nunca se debe hacer esto), se siempre se puede convertir de nuevo en una lista, añadir, a continuación, vuelva a una tupla:

tuple(list(a)+b) 

deja de recibir votos para esto, lo que significa que la gente sigue viendo, así que el tiempo para actualizar y eliminar desinformación.

Está bien agregar elementos a una tupla (más o menos). Eso fue una tontería decirlo. Las tuplas son aún inmutables, no puedes editarlas, pero puedes crear otras nuevas que se vean como adjuntas al juntar múltiples tuplas. tuple(list(a)+b) es estúpido, no hagas eso. Solo haz tuple1 + tuple2, porque Python no es una mierda. Para el código proporcionado, usted quiere:

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

La respuesta del Pablo a esta respuesta es mucho más correcto que esta respuesta fue siempre.

Ahora puedo dejar de sentirme mal por esto.

+22

"Nunca debe hacer esto" puede no ser un consejo útil, ya que * no * puede agregarse a una tupla :), pero con frecuencia es útil generar una tupla * nueva * que sea la misma que la anterior con más elementos agregados. Además, no es necesario convertir 'a' en' lista' en su segundo ejemplo; probablemente debería ser simplemente 'a + tuple (b)' o 'a + (b,)' si b es un elemento para agregar en lugar de iterable. –

+0

@thepaul Gracias por esa sintaxis. Pensé que 'b, + a' funcionaría, pero no es así, es por eso que terminé en esta página. Los corchetes son necesarios en este escenario, como lo tiene: '(b,) + a'. Sin embargo, intentar hacer 'tuple (b)' cuando b es un entero produce el error '' int 'object no es iterable'. Estoy usando Python 2.7.8. – spinup

+0

@thepaul '(1, 2) + (3,)' hizo el truco! – nmz787

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

ok..thats like sets ... using loops – user784530

+0

El OP escribió explícitamente que esta no era una opción para él. – runlevel0

1

tuple no se puede modificar en python.

así que después de inicializarlo con tupla (...), no se puede modificar.

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

Pero puede concatenar dos tuplas y reasignar el resultado a la variable que contiene la tupla, por lo que puede construir incrementalmente una tupla, como en las respuestas de byron o Josia. La pregunta es si esta es una forma eficiente de hacerlo, ya que el intérprete probablemente asignará nueva memoria para cada tupla que cree, lo que no ocurrirá si opera en una lista. – HelloGoodbye

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

El código anterior funcionará para concatenar cada vez que un nuevo tuple (i,) en estado tupla.

Estoy usando python 2.7.9.

2

sólo una especie de precis: (2,) es en realidad misma de tuple([2]) para que pueda escribir:

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

pitón es muy flexible, de hecho

1

Si desea una solución generalizada, simplemente construir una nueva lista y luego convertir eso en una tupla una vez terminado.

Puede aumentar progresivamente su tupla usando la solución proporcionada en las respuestas de Josia y Byron, pero eso creará una nueva tupla para cada iteración, lo cual es muy ineficiente si la lista que desea convertir es grande, porque el intérprete tendrá que copiar todos los elementos de la antigua tupla a la nueva tupla, en cada iteración, lo que requiere O (n^2) operaciones.

Esto no ocurre con las listas, ya que python realmente asignará más memoria que la requerida para almacenar los elementos de la lista, por si acaso anexa. Bueno, al menos no es necesario hasta que la memoria se agote y Python tenga que asignar más memoria. Luego, asignará un gran trozo de memoria y moverá todos los elementos a la nueva ubicación, pero una vez más esta nueva pieza de memoria será más grande que la requerida para almacenar los elementos de la lista. Crear una lista de esta manera solo requiere operaciones de O (n) y, por lo tanto, es preferible.

0

Después de tener problemas similares construcción de un C/NN con formas tensores flexibles, creo que he construido la solución más general a este problema:

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) 

Demostración:

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

No estoy seguro si este es malo Python, soy nuevo :)