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?
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
).
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
.
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))
data = input()
data=list(data)
data.sort()
Maintenant, la variable "data" aura une entrée sortexd fournie lexicographiquement.