Eu tenho alguns dados em uma lista de listas ou em uma lista de tuplas, como esta:
data = [[1,2,3], [4,5,6], [7,8,9]]
data = [(1,2,3), (4,5,6), (7,8,9)]
E eu quero classificar pelo segundo elemento no subconjunto. O significado, ordenando por 2,5,8 de onde 2
é (1,2,3)
, 5
é de (4,5,6)
. Qual é a maneira comum de fazer isso? Devo armazenar tuplas ou listas na minha lista?
Respostas:
ou:
fonte
key=itemgetter(1)
e no início do arquivo:from operator import itemgetter
sort
aqui está um método deList
objeto do Python, que recebe uma função lambda comokey
parâmetro. Você pode nomeá-lo comotup
, out
, ou o que quiser e ainda funcionará.tup
aqui especifica o índice da tupla da lista, o que1
significa que a classificação será realizada pelos segundos valores das tuplas da lista original (2, 5, 8
).lambda
abordagem intuitiva mais simples que aitemgetter
classeitemgetter
não intuitiva , na verdade parece ser mais rápida . Estou curioso para saber por que isso acontece. Minha suspeita grosseira é que alambda
incorre no custo oculto de capturar todas as variáveis locais em um contexto de fechamento, enquanto umaitemgetter
instância não. tl; dr: Sempre useitemgetter
, porque a velocidade vence.fonte
itemgetter
lambda
data.sort(key=itemgetter(3,1))
Eu só quero adicionar a resposta de Stephen se você quiser classificar o array de alto a baixo, outra maneira que não seja nos comentários acima é apenas adicionar isso à linha:
e o resultado será o seguinte:
fonte
Para classificar por vários critérios, ou seja, pelo segundo e terceiro elementos de uma tupla, deixe
e, assim, defina uma lambda que retorne uma tupla que descreva a prioridade, por exemplo
fonte
A resposta de Stephen é a que eu usaria. Para completar, eis o padrão DSU (decorate-sort-undecorate) com compreensões de lista:
Ou, mais sucintamente:
Conforme observado no Python Sorting HowTo , isso é desnecessário desde o Python 2.4, quando as principais funções se tornaram disponíveis.
fonte
Para classificar uma lista de tuplas
(<word>, <count>)
,count
em ordem decrescente eword
em ordem alfabética:Eu uso este método:
e isso me dá o resultado:
fonte
Sem lambda:
fonte
itemgetter()
é um pouco mais rápido quelambda tup: tup[1]
, mas o aumento é relativamente modesto (cerca de 10 a 25%).(Sessão IPython)
fonte
A resposta de @Stephen é direta! Aqui está um exemplo para uma melhor visualização,
Grite para os fãs do Ready Player One! =)
key
é uma função que será chamada para transformar os itens da coleção para comparação .. como ocompareTo
método em Java.O parâmetro passado para a chave deve ser algo que pode ser chamado. Aqui, o uso de
lambda
cria uma função anônima (que é uma chamada).A sintaxe do lambda é a palavra lambda seguida por um nome iterável e depois por um único bloco de código.
Abaixo do exemplo, estamos classificando uma lista de tuplas que contém as informações após o tempo de determinado evento e nome do ator.
Estamos classificando essa lista por hora da ocorrência do evento - que é o 0º elemento de uma tupla.
Nota -
s.sort([cmp[, key[, reverse]]])
classifica os itens de s no lugarfonte
Classificar uma tupla é bastante simples:
fonte