Acessando um valor em uma tupla que está em uma lista

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

Como faço para retornar o segundo valor de cada tupla dentro desta lista?

Saída desejada:

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

Respostas:

101

Com uma compreensão de lista .

[x[1] for x in L]
Ignacio Vazquez-Abrams
fonte
53
Eu entendo que esta é uma pergunta simples. SO é um lugar tão elitista? Tente pesquisar a pergunta no Google, os resultados não são o que eu preciso. Aprendi python da maneira mais difícil e não achei isso lá. Já fiz perguntas antes sobre a melhor abordagem para aprender Python e a resposta unânime é pegar um livro básico e mergulhar nele. Isso me frustra, pois simplesmente não consigo encontrar a solução em nenhum livro ou material online que tenho pesquisado por enquanto? Além disso, seu comentário realmente não é útil e desencoraja os novatos novos membros de postar no SO.
super9 de
1
@Nai: Sugiro ler o tutorial Python: docs.python.org/tutorial/index.html . Em geral, a documentação é muito boa. E às vezes, basta tentar;)
Felix Kling
19
Eu pesquisei "acessando item na tupla" com a intenção de acessar um item em uma lista de tupla. Isso me trouxe à sua pergunta, então, obrigado. Sou bastante novo em Python e não acho a resposta particularmente intuitiva, mas sou só eu!
Patrick Williams
8
Achei que todo o conceito do SO era para tornar mais fácil encontrar respostas para suas perguntas. Por que uma pergunta deve ter certa dificuldade para ser válida? Boa pergunta, boa resposta.
Sceluswe
3
Brilhante! Uma resposta curta, direta e direta a uma pergunta curta e direta. Vocês dois acabaram de fazer meu dia!
Eric M
82

A resposta de Ignacio é o que você quer. No entanto, como alguém que também está aprendendo Python, deixe-me tentar dissecá-lo para você ... Como mencionado, é uma compreensão de lista (abordada em DiveIntoPython3 , por exemplo). Aqui estão alguns pontos:

[x[1] for x in L]

  • Observe o []'s ao redor da linha de código. São eles que definem uma lista. Isso informa que este código retorna uma lista, portanto, é do listtipo. Conseqüentemente, essa técnica é chamada de "compreensão de lista".
  • L é sua lista original. Portanto, você deve definir L = [(1,2),(2,3),(4,5),(3,4),(6,7),(6,7),(3,8)]antes de executar o código acima.
  • xé uma variável que só existe na compreensão - tente acessar xfora da compreensão, ou digite type(x)após executar a linha acima e ela lhe dirá NameError: name 'x' is not defined, enquanto type(L)retorna <class 'list'>.
  • x[1]aponta para o segundo item em cada uma das tuplas, ao passo x[0]que apontaria para cada um dos primeiros itens.
  • Portanto, esta linha de código lê literalmente "retornar o segundo item em uma tupla para todas as tuplas na lista L."

É difícil dizer o quanto você tentou resolver o problema antes de fazer a pergunta, mas talvez você simplesmente não estivesse familiarizado com compreensões. Eu gastaria algum tempo lendo o Capítulo 3 de DiveIntoPython ou qualquer recurso sobre compreensões. Boa sorte.

Gary
fonte
4
Em 2.x, xexistirá fora do LC, com o último valor vinculado a ele. Isso foi corrigido no 3.x.
Ignacio Vazquez-Abrams
Eu não percebi isso. Obrigado pela informação.
Gary
4
Explicação incrível @gary. Agradeço especialmente por você apontar a que L se refere.
Patrick Williams
Obrigado pelo feedback @PatrickWilliams. Estou feliz que isso ajude. Você também pode fazer, [x[1] for x in [(1,2),(2,3),(4,5),(3,4),(6,7),(6,7),(3,8)]]mas não é tão fácil para os olhos.
Gary
5

A compreensão de uma lista é absolutamente a maneira de fazer isso. Outra forma que deve ser mais rápida é mape itemgetter.

import operator

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

Em resposta ao comentário de que o OP não conseguiu encontrar uma resposta no google, vou apontar uma forma super ingênua de fazer isso.

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

Isso usa:

  1. Declarando uma variável para fazer referência a uma lista vazia.
  2. Um laço for.
  3. Chamando o appendmétodo em uma lista.

Se alguém está tentando aprender um idioma e não consegue reunir essas peças básicas por si mesmo, precisa ver isso como um exercício e fazer isso sozinho, mesmo que demore vinte horas.

É preciso aprender a pensar sobre o que se quer e comparar com as ferramentas disponíveis . Cada elemento em minha segunda resposta deve ser abordado em um tutorial básico. Você não pode aprender a programar sem ler um .

Aaronasterling
fonte
2

Você também pode usar a descompactação de sequência com 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)

Isso também cria uma tupla _dos primeiros elementos descartados. Extrair apenas o segundo é possível, mas mais detalhado:

from itertools import islice

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

OU você pode 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]
>>> 

Ou 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]
>>> 
U11-Forward
fonte
0
a = [(0,2), (4,3), (9,9), (10,-1)]
print(list(map(lambda item: item[1], a)))
Rashmi
fonte
1
Explique um pouco sua resposta para que seja mais fácil de entender para outras pessoas que procuram por ela.
herrbischoff