Como classificar as letras em uma string em ordem alfabética em Python


157

Existe uma maneira fácil de classificar as letras em uma string em ordem alfabética em Python?

Então para:

a = 'ZENOVW'

Eu gostaria de retornar:

'ENOVWZ'

Respostas:


276

Você pode fazer:

>>> a = 'ZENOVW'
>>> ''.join(sorted(a))
'ENOVWZ'

Observe que sorted(a)retornará uma lista classificada, portanto, para comparações de strings, você não precisa join()(consulte a resposta abaixo).
Skippy le Grand Gourou

Observe que ''.join(sorted(a, reverse=True, key=str.lower))pode ser usado para executar uma classificação sem distinção entre maiúsculas e minúsculas. Pode ser útil.
Superdooperhero

89
>>> a = 'ZENOVW'
>>> b = sorted(a)
>>> print b
['E', 'N', 'O', 'V', 'W', 'Z']

sortedretorna uma lista, para que você possa transformá-la em uma string novamente usando join:

>>> c = ''.join(b)

que une os itens bcom uma sequência vazia ''entre cada item.

>>> print c
'ENOVWZ'

31

A solução Sorted () pode fornecer resultados inesperados com outras strings.

Lista de outras soluções:

Classifique as letras e faça-as distintas:

>>> s = "Bubble Bobble"
>>> ''.join(sorted(set(s.lower())))
' belou'

Classifique as letras e as diferencie, mantendo as letras maiúsculas:

>>> s = "Bubble Bobble"
>>> ''.join(sorted(set(s)))
' Bbelou'

Classifique as letras e mantenha as duplicatas:

>>> s = "Bubble Bobble"
>>> ''.join(sorted(s))
' BBbbbbeellou'

Se você quiser se livrar do espaço no resultado, adicione a função strip () em qualquer um dos casos mencionados:

>>> s = "Bubble Bobble"
>>> ''.join(sorted(set(s.lower()))).strip()
'belou'

Ei, essa primeira solução foi meio útil para um trabalho de casa em que eu tive que encontrar uma carta usando a bissecção. Sim, eu já sei sobre a classe string e o método find (), mas isso vai contra o propósito do exercício;)
runlevel0

9

Você pode usar reduzir

>>> a = 'ZENOVW'
>>> reduce(lambda x,y: x+y, sorted(a))
'ENOVWZ'

7

A função Python sortedretorna o resultado baseado em ASCII para a string.

INCORRETO : No exemplo abaixo, ee dé por trás He Wdevido é de valor ASCII.

>>>a = "Hello World!"
>>>"".join(sorted(a))
' !!HWdellloor'

CORRETO : Para escrever a sequência classificada sem alterar a caixa das letras. Use o código:

>>> a = "Hello World!"
>>> "".join(sorted(a,key=lambda x:x.lower()))
' !deHllloorW'

Se você deseja remover toda a pontuação e números. Use o código:

>>> a = "Hello World!"
>>> "".join(filter(lambda x:x.isalpha(), sorted(a,key=lambda x:x.lower())))
'deHllloorW'

3

o código pode ser usado para classificar as strings em ordem alfabética sem usar nenhuma função embutida do python

k = entrada ("Insira qualquer sequência novamente")

li = []
x = len(k)
for i in range (0,x):
    li.append(k[i])

print("List is : ",li)


for i in range(0,x):
    for j in range(0,x):
        if li[i]<li[j]:
            temp = li[i]
            li[i]=li[j]
            li[j]=temp
j=""

for i in range(0,x):
    j = j+li[i]

print("After sorting String is : ",j)

1
Idealmente, você deseja adicionar alguma explicação ao código para deixar claro o que ele faz. Bem-vindo ao SO!
geisterfurz007

1

Gostei muito da resposta com a função reduzir (). Aqui está outra maneira de classificar a string usando acumulate ().

from itertools import accumulate
s = 'mississippi'
print(tuple(accumulate(sorted(s)))[-1])

classificado (s) -> ['i', 'i', 'i', 'i', 'm', 'p', 'p', 's', 's', 's', 's' ]

tupla (acumular (classificado (s)) -> ('i', 'ii', 'iii', 'iiii', 'iiiim', 'iiiimp', 'iiiimpp', 'iiiimpps', 'iiiimppss', 'iiiimppsss ',' iiiimppssss ')

Estamos selecionando o último índice (-1) da tupla


Bem feito para sua primeira resposta. Apenas considere uma sequência de 1 milhão de caracteres, seu comando tuple () criará uma enorme lista de opções acumuladas que usam uma quantidade desnecessariamente grande de memória.
tda

Acordado. Portanto, para melhorar a complexidade do espaço, a idéia é trabalhar com o iterável, com a intenção de convertê-lo em uma estrutura de dados. Agradável. Obrigado.
Mono
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.