Cómo ordenar alfabéticamente las letras de una cadena en Python


157

¿Hay una manera fácil de ordenar las letras en una cadena alfabéticamente en Python?

Entonces para:

a = 'ZENOVW'

Me gustaria regresar:

'ENOVWZ'

Respuestas:


276

Tu puedes hacer:

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

Tenga en cuenta que sorted(a)devolverá una lista ordenada, por lo que para las comparaciones de cadenas no es necesario join()(consulte las respuestas a continuación).
Skippy le Grand Gourou

Tenga en cuenta que ''.join(sorted(a, reverse=True, key=str.lower))se puede utilizar para realizar una ordenación sin distinción entre mayúsculas y minúsculas. Podría ser útil.
Superdooperhero

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

sorteddevuelve una lista, por lo que puede convertirla en una cadena nuevamente usando join:

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

que une los elementos de bjunto con una cadena vacía ''entre cada elemento.

>>> print c
'ENOVWZ'

31

La solución Sorted () puede proporcionarle resultados inesperados con otras cadenas.

Lista de otras soluciones:

Ordenar letras y hacerlas distintas:

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

Ordena las letras y hazlas distintas mientras mantienes mayúsculas:

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

Ordenar letras y guardar duplicados:

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

Si desea deshacerse del espacio en el resultado, agregue la función strip () en cualquiera de los casos mencionados:

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

Oye, esa primera solución fue un poco útil para una tarea en la que tenía que encontrar una carta usando bisección. Sí, ya sé sobre la clase de cadena y el método find (), pero esto anula el propósito del ejercicio;)
runlevel0

9

Puedes usar reducir

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

7

La función Python sorteddevuelve el resultado basado en ASCII para la cadena.

INCORRECTO : en el siguiente ejemplo, ey destá detrás Hy Wdebido a su valor ASCII.

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

CORRECTO : para escribir la cadena ordenada sin cambiar el caso de la letra. Usa el código:

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

Si desea eliminar todos los signos de puntuación y números. Usa el código:

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

3

el código se puede usar para ordenar cadenas en orden alfabético sin usar ninguna función incorporada de python

k = input ("Ingrese cualquier cadena nuevamente")

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, desea agregar alguna explicación al código para dejar en claro lo que hace. Bienvenido a SO!
geisterfurz007

1

Realmente me gustó la respuesta con la función reduce (). Aquí hay otra forma de ordenar la cadena usando acumular ().

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

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

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

Estamos seleccionando el último índice (-1) de la tupla


Bien hecho por tu primera respuesta. Solo considere una cadena de 1 millón de caracteres, su comando tuple () creará una enorme lista de opciones acumuladas que usa una cantidad innecesariamente grande de memoria.
tda

Convenido. Entonces, para mejorar la complejidad del espacio, la idea es trabajar con el iterable mismo, en lugar de convertirlo en una estructura de datos. Agradable. Gracias.
Mono
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.