Como classificar uma lista de strings?
Pergunta
Qual é a melhor maneira de criar uma lista ordenada alfabeticamente em Python?
Solução
Resposta básica:
mylist = ["b", "C", "A"]
mylist.sort()
Isso modifica sua lista original (ou seja,classifica no local).Para obter uma cópia ordenada da lista, sem alterar o original, use o sorted()
função:
for x in sorted(mylist):
print x
No entanto, os exemplos acima são um pouco ingênuos, porque não levam em consideração a localidade e realizam uma classificação que diferencia maiúsculas de minúsculas.Você pode aproveitar o parâmetro opcional key
para especificar a ordem de classificação personalizada (a alternativa, usando cmp
, é uma solução obsoleta, pois precisa ser avaliada várias vezes - key
é calculado apenas uma vez por elemento).
Portanto, para classificar de acordo com a localidade atual, levando em consideração as regras específicas do idioma (cmp_to_key
é uma função auxiliar do functools):
sorted(mylist, key=cmp_to_key(locale.strcoll))
E finalmente, se precisar, você pode especificar um localidade personalizada para classificação:
import locale
locale.setlocale(locale.LC_ALL, 'en_US.UTF-8') # vary depending on your lang/locale
assert sorted((u'Ab', u'ad', u'aa'),
key=cmp_to_key(locale.strcoll)) == [u'aa', u'Ab', u'ad']
Última nota:você verá exemplos de classificação sem distinção entre maiúsculas e minúsculas que usam o lower()
método - estão incorretos, porque funcionam apenas para o subconjunto de caracteres ASCII.Esses dois estão errados para quaisquer dados que não sejam em inglês:
# this is incorrect!
mylist.sort(key=lambda x: x.lower())
# alternative notation, a bit faster, but still wrong
mylist.sort(key=str.lower)
Outras dicas
Também é digno de nota o sorted()
função:
for x in sorted(list):
print x
Isso retorna uma versão nova e classificada de uma lista sem alterar a lista original.
list.sort()
É realmente muito simples :)
A maneira correta de classificar strings é:
import locale
locale.setlocale(locale.LC_ALL, 'en_US.UTF-8') # vary depending on your lang/locale
assert sorted((u'Ab', u'ad', u'aa'), cmp=locale.strcoll) == [u'aa', u'Ab', u'ad']
# Without using locale.strcoll you get:
assert sorted((u'Ab', u'ad', u'aa')) == [u'Ab', u'aa', u'ad']
O exemplo anterior de mylist.sort(key=lambda x: x.lower())
funcionará bem para contextos somente ASCII.
Mas como isso lida com regras de classificação específicas do idioma?Isso leva em consideração a localidade?
Não, list.sort()
é uma função de classificação genérica.Se quiser classificar de acordo com as regras Unicode, você terá que definir uma função de chave de classificação personalizada.Você pode tentar usar o pyuca módulo, mas não sei quão completo ele é.
Por favor, use a função sorted() em Python3
items = ["love", "like", "play", "cool", "my"]
sorted(items2)
Suponha s = "ZWzaAd"
Para classificar a string acima, a solução simples estará abaixo de uma.
print ''.join(sorted(s))
Ou talvez:
names = ['Jasmine', 'Alberto', 'Ross', 'dig-dog']
print ("The solution for this is about this names being sorted:",sorted(names, key=lambda name:name.lower()))