Classificação da lista Python com base no comprimento da string


110

Quero classificar uma lista de strings com base no comprimento da string. Tentei usar classificar da seguinte maneira, mas não parece me dar o resultado correto.

xs = ['dddd','a','bb','ccc']
print xs
xs.sort(lambda x,y: len(x) < len(y))
print xs

['dddd', 'a', 'bb', 'ccc']
['dddd', 'a', 'bb', 'ccc']

O que pode estar errado?

Respostas:


201

Quando você passa um lambdato sort, você precisa retornar um inteiro, não um booleano. Portanto, seu código deve ser o seguinte:

xs.sort(lambda x,y: cmp(len(x), len(y)))

Observe que cmp é uma função embutida que cmp(x, y)retorna -1 se xfor menor que y, 0 se xfor igual a ye 1 se xfor maior quey .

Claro, você pode usar o keyparâmetro:

xs.sort(key=lambda s: len(s))

Isso diz ao sortmétodo para fazer o pedido com base no que quer que a função da tecla retorne.

EDITAR: Obrigado a balpha e Ruslan abaixo por apontar que você pode simplesmente passar lendiretamente como o parâmetro chave para a função, eliminando assim a necessidade de lambda:

xs.sort(key=len)

E, como Ruslan aponta abaixo, você também pode usar a função de classificação integrada em vez do list.sortmétodo, que cria uma nova lista em vez de classificar a existente no local:

print(sorted(xs, key=len))

32
Não há necessidade de lambda; apenas usekey = len
balpha

15
Isso classificará em ordem ascendente (comprimento menor das palavras no topo), para classificar em ordem decrescente (comprimento menor das palavras na parte inferior) adicione um parâmetro reverso = Verdadeiro
Ajay Gupta

O xs.sort()lance "TypeError: sort () não leva argumentos posicionais". Em vez disso, deveria serxs.sort(key=lambda x: len(x))
Hi-Angel

84

O mesmo da resposta de Eli - apenas usando uma forma mais curta, porque você pode pular um lambda parte aqui.

Criando nova lista:

>>> xs = ['dddd','a','bb','ccc']
>>> sorted(xs, key=len)
['a', 'bb', 'ccc', 'dddd']

Classificação no local:

>>> xs.sort(key=len)
>>> xs
['a', 'bb', 'ccc', 'dddd']

5
Como reverter a classificação no comprimento?
user2922935

1
@ user2922935: Você pode fazer xs [:: - 1] para reverter a lista já classificada. Confira o artigo de Dan Bader aqui: dbader.org/blog/python-reverse-list
Thyag

7
xs.sort(key=len, reverse=True)
Raz

5

Eu gostaria de adicionar como a função da tecla pítônica funciona durante a classificação:

Padrão de Design Decorate-Sort-Undecorate:

O suporte do Python para uma função chave durante a classificação é implementado usando o que é conhecido como padrão de design decorar-classificar-não-decorar.

Ele prossegue em 3 etapas:

  1. Cada elemento da lista é temporariamente substituído por uma versão “decorada” que inclui o resultado da função-chave aplicada ao elemento.

  2. A lista é classificada com base na ordem natural das chaves.

  3. Os elementos decorados são substituídos pelos elementos originais.

Parâmetro chave para especificar uma função a ser chamada em cada elemento da lista antes de fazer comparações. docs


4

A maneira mais fácil de fazer isso é:

list.sort (chave = lambda x: len (x))


1

Escreva uma função lensort para classificar uma lista de strings com base no comprimento.

def lensort(a):
    n = len(a)
    for i in range(n):
        for j in range(i+1,n):
            if len(a[i]) > len(a[j]):
                temp = a[i]
                a[i] = a[j]
                a[j] = temp
    return a
print lensort(["hello","bye","good"])

0
def lensort(list_1):
    list_2=[];list_3=[]
for i in list_1:
    list_2.append([i,len(i)])
list_2.sort(key = lambda x : x[1])
for i in list_2:
    list_3.append(i[0])
return list_3

Isso funciona para mim!


0

Posso fazer isso usando os dois métodos abaixo, usando a função

def lensort(x):
    list1 = []
    for i in x:
        list1.append([len(i),i])
    return sorted(list1)

lista = ['a', 'bb', 'ccc', 'dddd']
a=lensort(lista)
print([l[1] for l in a])

Em um Liner usando Lambda, conforme abaixo, a já respondida acima.

 lista = ['a', 'bb', 'ccc', 'dddd']
 lista.sort(key = lambda x:len(x))
 print(lista)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.