web-dev-qa-db-fra.com

Trier une chaîne dans l'ordre lexicographique python

Je veux trier une chaîne sur une liste dans l'ordre lexicographique

str='aAaBbcCdE'

à 

['A','a','a','B','b','C','c','d','E']

mais sorted() me donne cette sortie:

['A','B','C','E','a','a','b','c','d']

Comment puis-je trier le lexicographe?

21
Bipul Jain

N'utilisez pas les fonctions lambda quand il en existe pour le travail. De même, n'utilisez jamais l'argument cmp de sort car il est obsolète:

sorted(s, key=str.lower)

ou 

sorted(s, key=str.upper)

Mais cela ne peut pas garder 'A' et 'a' en ordre, alors:

sorted(sorted(s), key=str.upper)

cette volonté et, de par la nature de sorted, l'opération sera très rapide pour des listes presque triées (la deuxième sorted).

31
JBernardo

Vous pouvez utiliser un 2-Tuple pour la clé:

text='aAaBbcCdE'
sorted(text,key=lambda x:(str.lower(x),x))
# ['A', 'a', 'a', 'B', 'b', 'C', 'c', 'd', 'E']

Le premier élément du tuple, str.lower(x), est la clé primaire (faire passer a avant avant B), tandis que x lui-même rompt les liens (faisant A venir avant a.

11
unutbu

cmp était l'ancienne façon de faire, maintenant déconseillée, mais pour la postérité:

s='aAaBbcCdE'
sorted(s, lambda x,y: cmp(x.lower(), y.lower()) or cmp(x,y))
4
Karoly Horvath

data = input() data=list(data) data.sort()

Maintenant, la variable "data" aura une entrée sortexd fournie lexicographiquement. 

0
tushar