Pergunta

Qual é a melhor maneira de criar uma lista ordenada alfabeticamente em Python?

Foi útil?

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()))
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top