Acceder a un valor en una tupla que está en una lista


88
[(1,2), (2,3), (4,5), (3,4), (6,7), (6,7), (3,8)]

¿Cómo devuelvo el segundo valor de cada tupla dentro de esta lista?

Salida deseada:

[2, 3, 5, 4, 7, 7, 8]

Respuestas:


100

Con una lista de comprensión .

[x[1] for x in L]

52
Entiendo que esta es una pregunta simple. ¿Es SO un lugar tan elitista? Intente buscar en Google la pregunta, los resultados no son los que necesito. Aprendí Python de la manera difícil y no encontré esto allí. Hice preguntas antes sobre el mejor enfoque para aprender Python y la respuesta unánime es obtener un libro básico y sumergirse en él. Me frustra y no puedo encontrar la solución en ningún libro o material en línea que haya buscado hasta ahora Además, su comentario realmente no es útil y desalienta a los nuevos miembros de publicar en SO.
super9

1
@Nai: sugiero leer el tutorial de Python: docs.python.org/tutorial/index.html . En general, la documentación es muy buena. Y a veces, uno solo tiene que intentarlo;)
Felix Kling

19
Busqué en Google "acceder a un elemento en una tupla" con la intención de acceder a un elemento en una lista de tuplas. Me llevó a tu pregunta, así que gracias. Soy bastante nuevo en Python y no encuentro la respuesta particularmente intuitiva, ¡pero soy solo yo!
Patrick Williams

7
Pensé que todo el concepto de SO era facilitar la búsqueda de respuestas a sus preguntas. ¿Por qué una pregunta debe tener cierta dificultad para ser válida? Buena pregunta, buena respuesta.
Sceluswe

3
¡Brillante! Una respuesta corta, aguda y al grano a una pregunta corta, aguda y al grano. ¡Ambos me alegraron el día!
Eric M

82

La respuesta de Ignacio es lo que quieres. Sin embargo, como alguien que también está aprendiendo Python, déjame intentar analizarlo por ti ... Como se mencionó, es una lista de comprensión (cubierta en DiveIntoPython3 , por ejemplo). Aquí hay algunos puntos:

[x[1] for x in L]

  • Observe que hay []alrededor de la línea de código. Estos son los que definen una lista. Esto le dice que este código devuelve una lista, por lo que es del listtipo. Por lo tanto, esta técnica se denomina "comprensión de listas".
  • L es tu lista original. Por lo tanto, debe definir L = [(1,2),(2,3),(4,5),(3,4),(6,7),(6,7),(3,8)]antes de ejecutar el código anterior.
  • xes una variable que solo existe en la comprensión - intente acceder xfuera de la comprensión, o escriba type(x)después de ejecutar la línea anterior y le dirá NameError: name 'x' is not defined, mientras que type(L)devuelve <class 'list'>.
  • x[1]apunta al segundo elemento de cada una de las tuplas, mientras x[0]que apuntaría a cada uno de los primeros elementos.
  • Así que esta línea de código literalmente dice "devolver el segundo elemento en una tupla para todas las tuplas en la lista L."

Es difícil saber cuánto intentó resolver el problema antes de hacer la pregunta, pero ¿tal vez no estaba familiarizado con las comprensiones? Pasaría algún tiempo leyendo el Capítulo 3 de DiveIntoPython , o cualquier recurso sobre comprensiones. Buena suerte.


4
En 2.x, xexistirá fuera del LC, con el último valor vinculado a él. Esto está arreglado en 3.x.
Ignacio Vazquez-Abrams

No me di cuenta de esto. Gracias por la info.
gary

4
Increíble explicación @gary. Agradezco especialmente que hayas señalado a qué se refiere L.
Patrick Williams

Gracias por los comentarios @PatrickWilliams. Me alegro de que esto ayude. También puedes hacerlo, [x[1] for x in [(1,2),(2,3),(4,5),(3,4),(6,7),(6,7),(3,8)]]pero no es tan agradable a la vista.
gary

5

Una lista de comprensión es absolutamente la forma de hacer esto. Otra forma que debería ser más rápida es mapy itemgetter.

import operator

new_list = map(operator.itemgetter(1), old_list)

En respuesta al comentario de que el OP no pudo encontrar una respuesta en Google, señalaré una forma súper ingenua de hacerlo.

new_list = []
for item in old_list:
    new_list.append(item[1])

Esto usa:

  1. Declarar una variable para hacer referencia a una lista vacía.
  2. Un bucle for.
  3. Llamar al appendmétodo en una lista.

Si alguien está tratando de aprender un idioma y no puede armar estas piezas básicas por sí mismo, entonces debe verlo como un ejercicio y hacerlo por sí mismo, incluso si le lleva veinte horas.

Uno necesita aprender a pensar en lo que quiere y compararlo con las herramientas disponibles . Cada elemento de mi segunda respuesta debe cubrirse en un tutorial básico. No se puede aprender a programar sin leer uno .


2

O puede usar pandas:

>>> import pandas as pd
>>> L = [(1,2),(2,3),(4,5),(3,4),(6,7),(6,7),(3,8)]
>>> df=pd.DataFrame(L)
>>> df[1]
0    2
1    3
2    5
3    4
4    7
5    7
6    8
Name: 1, dtype: int64
>>> df[1].tolist()
[2, 3, 5, 4, 7, 7, 8]
>>> 

O bien numpy:

>>> import numpy as np
>>> L = [(1,2),(2,3),(4,5),(3,4),(6,7),(6,7),(3,8)]
>>> arr=np.array(L)
>>> arr.T[1]
array([2, 3, 5, 4, 7, 7, 8])
>>> arr.T[1].tolist()
[2, 3, 5, 4, 7, 7, 8]
>>> 

1

También puede utilizar la secuencia de desembalaje con zip:

L = [(1,2),(2,3),(4,5),(3,4),(6,7),(6,7),(3,8)]

_, res = zip(*L)

print(res)

# (2, 3, 5, 4, 7, 7, 8)

Esto también crea una tupla a _partir de los primeros elementos descartados. Extraer solo el segundo es posible, pero más detallado:

from itertools import islice

res = next(islice(zip(*L), 1, None))

0
a = [(0,2), (4,3), (9,9), (10,-1)]
print(list(map(lambda item: item[1], a)))

1
Por favor, explique su respuesta un poco para que sea más fácil de entender para otras personas que la busquen.
herrbischoff
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.