10
votes

Python Trier des cordes avec des chiffres à la fin

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: xxx

doit mettre le 1234 à la fin. Y a-t-il un moyen facile de faire cela?


1 commentaires

Veuillez ne pas utiliser list comme nom de variable. C'est une très mauvaise idée.


8 Réponses :


1
votes

Le problème est que le tri est alphabétique ici car ils sont des chaînes fortes>. Chaque séquence de caractère est comparée avant de passer au caractère suivant.

>>> 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']
>>> 


0 commentaires

1
votes
l = ['asdf123', 'asdf1234', 'asdf111', 'asdf124']
l.sort(cmp=lambda x,y:cmp(int(x[4:]), int(y[4:]))

3 commentaires

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 a été autour depuis 2.4 et CMP 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é 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 sur trier .



6
votes

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']


1 commentaires

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.



1
votes

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. xxx

sans la lambda et l'expression conditionnelle qui est xxx

cela profite simplement du fait que les tuples trient par le premier élément, puis le seconde. Donc, parce que la fonction 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' comparera à 'asd7890' comme ('asdfbad', 123) se compare à ("asd" , 7890) . 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>


0 commentaires

0
votes
L.sort(key=lambda s:int(''.join(filter(str.isdigit,s[-4:]))))

4 commentaires

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'.



2
votes

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 .

L'algorithme d'une sorte naturel est approximativement comme suit:

  • Split chaque valeur en "morceaux" alphabétiques et numériques "morceaux"
  • Trier par le premier morceau de chaque valeur
    • Si le morceau est alphabétique, triez-le comme d'habitude
    • Si le morceau est numérique, trier par la valeur numérique représentée
    • Prenez les valeurs qui ont le même premier morceau et triez-les par le deuxième morceau
    • et ainsi de suite sur

0 commentaires

16
votes

Y a-t-il un moyen facile de faire cela?

OUI

Vous pouvez utiliser le NATSORT module. xxx

divulgation complète, je suis l'auteur du paquet.


1 commentaires

C'est un économiseur de vie! Facile et efficace



0
votes

Plutôt que de diviser chaque ligne moi-même, je demande à Python de le faire pour moi avec re.findall () : xxx


0 commentaires