Classifique as tuplas com base no segundo parâmetro

95

Eu tenho uma lista de tuplas que se parecem com isto:

("Person 1",10)
("Person 2",8)
("Person 3",12)
("Person 4",20)

O que quero que seja produzida é a lista classificada em ordem crescente, pelo segundo valor da tupla. Portanto, L [0] deve estar ("Person 2", 8)após a classificação.

Como posso fazer isso? Usando Python 3.2.2 Se isso ajudar.

user974703
fonte
1
possível duplicata de Classificação de uma tupla que contém tuplas
JBernardo

Respostas:

191

Você pode usar o keyparâmetro para list.sort():

my_list.sort(key=lambda x: x[1])

ou, um pouco mais rápido,

my_list.sort(key=operator.itemgetter(1))

(Como com qualquer módulo, você precisará import operatorser capaz de usá-lo.)

Sven Marnach
fonte
3
Eu tentei usar L.sort(key=operator.itemgetter(1))no meu código, mas recebo um NameError, que 'operador' não está definido. Eu preciso importar algo especial?
user974703
3
Fiz uma busca, preciso usar import operatorpara usar a função. Se você adicionar isso à sua resposta, marcarei como aceito.
user974703
Testando com timeit.timeit (opções padrão) não há uma grande diferença entre essas duas abordagens: operator.itemgetter = 1.05µs, lambda = 1.25µs por iteração
Noel Evans
Obrigado pela solução my_list.sort (key = operator.itemgetter (1)) !! :)
aman_novice
1
Se você é novo na palavra-chave lambda: stackoverflow.com/questions/13669252/what-is-key-lambda
EchoLynx
12

E se você estiver usando o python 3.X, você pode aplicar a sortedfunção na minha lista. Este é apenas um acréscimo à resposta que @Sven Marnach deu acima.

# using *sort method*
mylist.sort(lambda x: x[1]) 

# using *sorted function*
sorted(mylist, key = lambda x: x[1]) 
Samuel Nde
fonte
Este é apenas o embutido que retorna uma nova lista. Sua resposta não contribui em nada para as que já estão aqui, pois é claro que se você quisesse uma nova lista, você usaria no sortedlugar de list.sort.
miradulo
2
@SamuelNde Eu rolei para baixo aqui porque não tinha certeza se a expressão funcionava da mesma forma para classificar, então me ajudou.
Chapeuzinho Vermelho
Sim, concordo, isso me ajudou também
StackG
-1
    def findMaxSales(listoftuples):
        newlist = []
        tuple = ()
        for item in listoftuples:
             movie = item[0]
             value = (item[1])
             tuple = value, movie

             newlist += [tuple]
             newlist.sort()
             highest = newlist[-1]
             result = highest[1]
       return result

             movieList = [("Finding Dory", 486), ("Captain America: Civil                      

             War", 408), ("Deadpool", 363), ("Zootopia", 341), ("Rogue One", 529), ("The  Secret Life of Pets", 368), ("Batman v Superman", 330), ("Sing", 268), ("Suicide Squad", 325), ("The Jungle Book", 364)]
             print(findMaxSales(movieList))

saída -> Rogue One

Darrell White
fonte
Algumas considerações: Isso não responde realmente à pergunta (como obter uma lista classificada por um valor na tupla); Você poderia descompactar a tupla diretamente em seu loop (para filme, valor em listoftuples:); você substituiu o tipo 'tupla'; E isso pode realmente ser feito em uma única compreensão de lista: (retornar classificado ((valor, filme) para filme, valor em lista deuplos) [- 1] [1])
RFox
Eu aprecio o que você está buscando, mas eu diria que falta elegância e poderia ser melhorado. Geralmente seria considerado uma prática ruim transformar a ordem dos elementos em um tupple como este. Acho que os pontos sobre a compreensão da lista e desempacotamento de tupples ainda permaneceriam. E eu desencorajaria qualquer um que use essa metodologia em vez da resposta aceita.
RFox
Eu sou incapaz e não consegui obter o código que você postou para funcionar, provavelmente um erro do usuário
Darrell White
mas mudou um pouco e sem dúvida sua resposta é 200x melhor.
Darrell White
def findMaxSales (listoftuples): newlist = Sorting ((value, movies) for movies, value in listoftuples) return newlist [-1] [1] movieList = [("Finding Dory", 486), ("Capitão América: Guerra Civil ", 408), (" Deadpool ", 363), (" Zootopia ", 341), (" Rogue One ", 529), (" The Secret Life of Pets ", 368), (" Batman v Superman ", 330 ), ("Sing", 268), ("Suicide Squad", 325), ("The Jungle Book", 364)] imprimir (findMaxSales (movieList))
Darrell White