Gostaria de saber qual é a melhor maneira de extrair o primeiro item de cada sublist em uma lista de listas e anexá-lo a uma nova lista. Então, se eu tiver:
lst = [[a,b,c], [1,2,3], [x,y,z]]
e eu quero sair a
, 1
e x
e criar uma lista separada daqueles.
Eu tentei:
lst2.append(x[0] for x in lst)
Respostas:
Usando a compreensão da lista :
fonte
Você pode usar o zip:
Ou, Python 3, onde
zip
não produz uma lista:Ou,
Ou, (meu favorito), use numpy:
fonte
list
-o primeiro ou use-onext
. ObrigadoTeve o mesmo problema e ficou curioso sobre o desempenho de cada solução.
Aqui está o
%timeit
:A primeira maneira numpy, transformando a matriz:
Totalmente nativo usando compreensão de lista (como explicado por @alecxe):
Outra maneira nativa de usar
zip
(como explicado por @dawg):Segundo numpy-way. Também explicado por @dawg:
Surpreendentemente (bem, pelo menos para mim) a maneira nativa usando a compreensão de lista é a mais rápida e cerca de 10x mais rápida que a maneira numpy. A execução dos dois modos numpy sem a final
list
economiza cerca de um µs, o que ainda está na diferença de 10x.Observe que, quando envolvi cada trecho de código com uma chamada para
len
, para garantir que os Geradores funcionassem até o final, o tempo permaneceu o mesmo.fonte
Python inclui uma função chamada itemgetter para retornar o item em um índice específico em uma lista:
Passe a função itemgetter () o índice do item que você deseja recuperar. Para recuperar o primeiro item, você usaria o itemgetter (0). O importante é entender que o itemgetter (0) em si retorna uma função. Se você passar uma lista para essa função, obtém o item específico:
Isso é útil quando você o combina com map (), que assume uma função como seu primeiro argumento e uma lista (ou qualquer outro iterável) como o segundo argumento. Retorna o resultado da chamada da função em cada objeto no iterável:
Observe que map () retorna um gerador; portanto, o resultado é passado para list () para obter uma lista real. Em resumo, sua tarefa pode ser feita assim:
Esse é um método alternativo ao uso da compreensão de uma lista e o método a ser escolhido depende muito do contexto, legibilidade e preferência.
Mais informações: https://docs.python.org/3/library/operator.html#operator.itemgetter
fonte
Seu código está quase correto. O único problema é o uso da compreensão da lista.
Se você usar como: (x [0] para x em lst), ele retornará um objeto gerador. Se você usar como: [x [0] para x em lst], ele retornará uma lista.
Quando você anexa a saída de compreensão da lista a uma lista, a saída da compreensão da lista é o elemento único da lista.
lst2 = [['a', 1, 'x']]
lst2 [0] = ['a', 1, 'x']
Informe-me se estiver incorreto.
fonte
Resultado:
['a', 1, 'x']
fonte
Você disse que tem uma lista existente. Então eu vou com isso.
Agora você está anexando o objeto gerador à sua segunda lista.
Mas você provavelmente quer que seja uma lista dos primeiros itens
Agora, anexamos a lista dos primeiros itens à lista existente. Se você deseja adicionar os itens com temas, não uma lista deles, aos existentes, use list.extend. Nesse caso, não precisamos nos preocupar em adicionar um gerador, porque o prolongamento usará esse gerador para adicionar cada item recebido a partir daí, para estender a lista atual.
ou
https://docs.python.org/3.4/tutorial/datastructures.html#more-on-lists https://docs.python.org/3.4/tutorial/datastructures.html#list-comprehensions
fonte
append
na questão está causando confusão. Parece que ele simplesmente quer a parte da compreensão da lista da sua solução.