Quel est le moyen le plus simple de trier une liste de chaînes avec des chiffres à la fin où certains ont 3 chiffres et certains ont 4: doit mettre le 1234 à la fin. Y a-t-il un moyen facile de faire cela? p> p>
8 Réponses :
Le problème est que le tri est >>> x = ['asdf123', 'asdf1234', 'asdf111', 'asdf124']
>>> y = [ int(t[4:]) for t in x]
>>> z = sorted(y)
>>> z
[111, 123, 124, 1234]
>>> l = ['asdf'+str(t) for t in z]
>>> l
['asdf111', 'asdf123', 'asdf124', 'asdf1234']
>>>
l = ['asdf123', 'asdf1234', 'asdf111', 'asdf124'] l.sort(cmp=lambda x,y:cmp(int(x[4:]), int(y[4:]))
Cela aurait été une bonne solution tout le chemin du retour avant Rick-Rolling était drôle ( Oui, c'était drôle à un moment donné). Key CODE> a été autour depuis 2.4 et
CMP code> est obsolète et supprimé en 3.x. Je ne sais vraiment pas comment des ordures comme ça ont eu deux upvotes. Cela ne compare même pas au reste des cordes.
Ils ont Supprimé B> CMP? Sérieusement? Je suis déçu. Comment êtes-vous censé trier les chaînes dans l'ordre inverse maintenant - en inversant explicitement après? Ce n'est pas comme si vous pouvez nier une chaîne de manière à utiliser lambda x: -x comme clé ...
@Karlknechtel Voir alors que ce commentaire a 9 ans, vous le savez probablement d'ici, mais vous pouvez inverser tout en triant avec l'argument de mots-clés code> sur trier code>.
Y a-t-il un moyen facile de faire cela? P>
NON P>
Il est parfaitement pas clair quelles sont les règles réelles. Les "certains ont 3 chiffres et certains ont 4" n'est pas vraiment une spécification très précise ou complète. Tous vos exemples montrent 4 lettres devant les chiffres. Est-ce toujours vrai? P>
xxx pré> que la fonction code> fonctionne code> peut faire ce que vous voulez. Ou il pourrait être trop complexe. Ou peut-être que le motif est vraiment
r "^ (. *) (\ D {3,4}) $" code> ou peut-être que les règles sont encore plus obscures. P>
>>> data= ['asdf123', 'asdf1234', 'asdf111', 'asdf124'] >>> data.sort( key=key ) >>> data ['asdf111', 'asdf123', 'asdf124', 'asdf1234']
C'est presque exactement ce que j'allais dire à l'astucieux. Il a besoin de définir une regex pour séparer son entrée mixte, analyser la partie intégrante et trier en conséquence.
Vous avez besoin d'une fonction clé. Vous êtes prêt à spécifier 3 ou 4 chiffres à la fin et j'ai un sentiment que vous souhaitez qu'ils comparent numériquement. sans la lambda et l'expression conditionnelle qui est p> cela profite simplement du fait que les tuples trient par le premier élément, puis le seconde. Donc, parce que la fonction code> code> est appelée pour obtenir une valeur à comparer, les éléments seront maintenant comparés comme les tuples renvoyés par la fonction clé. Par exemple, 'asdfbad123' code> comparera à
'asd7890' code> comme
('asdfbad', 123) code> se compare à
("asd" , 7890) code>. Si les 3 derniers caractères d'une chaîne ne sont pas en réalité, vous obtiendrez une ValueError parfaitement appropriée, étant donné que vous avez transmis les données informatiques qui ne correspondent pas aux spécifications qu'il a été conçue pour. P> < / p>
L.sort(key=lambda s:int(''.join(filter(str.isdigit,s[-4:]))))
Aaronasterling me donne la pensée: l.sort (clé = lambda s: int ((S [-3:], S [-4:]) [S [-4] dans '1234567890']))
Ce n'est pas bon parce qu'en est-il de 'ASDF23 ASDF1234'? La solution dans votre commentaire est bonne mais délicate. Mais vous devez toujours inclure le reste de la chaîne pour trier dans vos deux solutions.
Eh bien, si vous insistez pour comparer le reste de la chaîne, vous devez toujours utiliser les chiffres comme première clé et le repos de seconde.
Ce serait très inattendu. Si les lettres arrivent en premier dans la chaîne, ils devraient venir en premier dans la clé Tuple. Donc, "AARON345" devrait trier avant 'BOB123'.
Qu'est-ce que vous décrivez probablement s'appelle un Trier naturel ou un type humain. Si vous utilisez Python, vous pouvez emprunter à partir de implémentation de la NED . P>
L'algorithme d'une sorte naturel est approximativement comme suit: P>
Y a-t-il un moyen facile de faire cela? P>
OUI P>
Vous pouvez utiliser le NATSORT module. P>
xxx pré> divulgation complète, je suis l'auteur du paquet. P> blockQquote>
C'est un économiseur de vie! Facile et efficace
Plutôt que de diviser chaque ligne moi-même, je demande à Python de le faire pour moi avec re.findall () code>:
Veuillez ne pas utiliser
list code> comme nom de variable. C'est une très mauvaise idée.