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.
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.
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.
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:
Declarando uma variável para fazer referência a uma lista vazia.
Um laço for.
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 .
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]
[]
'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, é dolist
tipo. Conseqüentemente, essa técnica é chamada de "compreensão de lista".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 acessarx
fora da compreensão, ou digitetype(x)
após executar a linha acima e ela lhe diráNameError: name 'x' is not defined
, enquantotype(L)
retorna<class 'list'>
.x[1]
aponta para o segundo item em cada uma das tuplas, ao passox[0]
que apontaria para cada um dos primeiros itens.É 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.
fonte
x
existirá fora do LC, com o último valor vinculado a ele. Isso foi corrigido no 3.x.[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.A compreensão de uma lista é absolutamente a maneira de fazer isso. Outra forma que deve ser mais rápida é
map
eitemgetter
.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:
append
mé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 .
fonte
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))
fonte
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] >>>
fonte
a = [(0,2), (4,3), (9,9), (10,-1)] print(list(map(lambda item: item[1], a)))
fonte