Les nombres ordinaux de remplacement
Je suis actuellement à la recherche de la façon de remplacer les mots comme première, deuxième, troisième,...avec approprié un nombre ordinal de la représentation (1er, 2e, 3e).
J'ai été googler pour la semaine dernière et je n'ai pas trouvé utile d'outils standard ou de toute fonction de NLTK.
Si il ya une ou devrais-je écrire des expressions régulières manuellement?
Merci pour tous les conseils
- Si vous ne pouvez pas en trouver un, il ne devrait pas être trop dur à rouler votre propre, parce que le format numérique est très stricte. Quelque chose comme
pyparsing
serait plus facile, trop!
Vous devez vous connecter pour publier un commentaire.
Voici un laconique solution de prise de Gareth sur codegolf:
Fonctionne sur n'importe quel nombre:
Pour python 3.4+,
math.floor
est nécessaire:/
d'être entier de la division, ce qui a changé entre Python 2 et 3math.floor
) fonctionne. Est cette version qui est-elle encore nécessaire?Comment à ce sujet:
La accepté de répondre à une précédente question dispose d'un algorithme pour la moitié de ce: il s'avère
"first"
en1
. Pour aller de là à"1st"
, faire quelque chose comme:Cela ne fonctionne que pour les numéros de 0 à 19 ans.
suffixes
liste par la mise en place de votre dict que{'first': '1st'}
, etc.Je voulais utiliser des ordinaux pour un projet de mine et après quelques prototypes je pense que cette méthode, bien que pas un petit travail pour tout entier positif, oui tout entier.
Il fonctionne par determiniting si le nombre est au-dessus ou en dessous de 20, si le nombre est inférieur à 20, il va tourner à la int 1 dans la chaîne 1er , 2 , 2e, 3, 3e, et le reste sera "st" a été ajoutée.
Pour les numéros de plus de 20, il va prendre le dernier et l'avant dernier chiffres, que j'ai appelé la les dizaines et les unité de, respectivement, et de les tester pour voir ce qu'il faut ajouter à ce nombre.
C'est en python par la manière, donc je ne sais pas si d'autres langues seront en mesure de trouver le dernier ou l'avant-dernier caractère d'une chaîne, s'ils font cela devrait se traduire assez facilement.
J'ai appelé la fonction "o" pour la facilité d'utilisation et peut être appelé par l'importation du nom de fichier que j'ai appelé "ordinal" par l'importation ordinale puis ordinale.o(nombre).
Laissez-moi savoir ce que vous en pensez 😀
Je me suis fait quelque chose de similaire, ayant besoin de convertir les adresses avec les nombres ordinaux ("Tiers-St') dans un format un géocodeur pourrait comprendre ("3rd St'). Si ce n'est pas très élégant, un rapide et sale solution est d'utiliser le inflect.py pour générer un dictionnaire de traduction.
inflect.py a un
number_to_words()
fonction, un nombre (par exemple,2
) à la forme du mot (par exemple,'two'
). En outre, il y a unordinal()
fonction qui va prendre n'importe quel nombre (chiffre ou d'une forme de mot) et de le transformer dans une forme ordinale (par exemple4
->fourth
,six
->sixth
). Ni de ceux qui, sur leur propre, faites ce que vous cherchez, mais vous pouvez utiliser pour générer un dictionnaire pour traduire tout fourni ordinal-nombre de mots (dans une fourchette raisonnable) pour sa numéral ordinal. Prendre un coup d'oeil:Si vous êtes prêt à commettre un certain temps, il pourrait être possible d'examiner inflect.py's rouages dans ces deux fonctions et de construire votre propre code pour le faire dynamiquement (je n'ai pas essayé de le faire).
Une autre solution est l'
num2words
bibliothèque (pip | github).Il est particulièrement à l'offre de langues différentes, de sorte que la localisation/internationalisation (aka. l10n/i18n) est un no-brainer.
Utilisation est facile après que vous l'avez installé avec
pip install num2words
:Bonus:
Si vous ne voulez pas tirer dans une autre dépendance sur une bibliothèque externe (comme suggéré par luckydonald), mais aussi ne veulent pas le futur responsable de la code vous hanter vers le bas et vous tuer (parce que vous avez utilisé ont joué au golf de code de la production) alors voici un court-mais-maintenable variante:
lambda n: "".join([str(n), ['th', 'st', 'nd', 'rd', 'th'][min(n % 10, 4)] if not 11 <= n <= 13 else "th"])
par exempledt_tr_fn = lambda n: "".join([str(n), ['th', 'st', 'nd', 'rd', 'th'][min(n % 10, 4)] if not 11 <= n <= 13 else "th"])
[dt for dt in map(dt_tr_fn, range(1,32))]
@ye-lin-aung11 <= (n % 100) <= 13
au lieu de simplementn
, sinon ce sera un échec pour, par exemple,112
.Si l'aide de django, vous pouvez faire:
(ou utilisez ordinale dans un django modèle que le modèle de filtre il était destiné à être, si l'appelant comme ce à partir de code python qui fonctionne aussi bien)
Si vous n'utilisez pas de django vous pourriez voler leur mise en œuvre qui est très soignée.
cette fonction fonctionne bien pour chaque numéro n. Si n est négatif, il est converti en positif. Si n n'est pas entier, il est converti en entier.
Si vous ne souhaitez pas importer un module externe et préfèrent une solution en ligne, puis le suivant est sans doute (un peu) plus lisible que l'on a accepté la réponse:
Il utilise le dictionnaire
.get
, comme suggéré par https://codereview.stackexchange.com/a/41300/90593 et https://stackoverflow.com/a/36977549/5069869.J'ai fait usage de multiplication avec un booléen pour gérer les cas particuliers (11,12,13), sans avoir à lancer une si-bloc. Si la condition
(i%100 not in [11,12,13])
évalue àFalse
, le nombre entier 0 et nous obtenons la valeur par défaut 'th' cas.Ce peut gérer n'importe quel numéro de longueur, les exceptions pour les ...#11 à ...n ° 13 et les entiers négatifs.
Je suggère d'utiliser ith() comme un nom pour éviter la substitution de la builtin ord().
Remarque: Testé avec Python 3.6; de L'abs() la fonction était disponible, sans explicitement, y compris un module math.
C'est une alternative en utilisant les options de num2words paquet.
Essayer cette
Ici est plus compliqué solution que j'ai juste écrit que prend en compte aggravé les ordinaux. Il fonctionne donc à partir de
first
tout le chemin ànine hundred and ninety ninth
. J'en avais besoin pour convertir la chaîne de caractères des noms de rue pour le nombre ordinaux:Et voici quelques exemples d'utilisation:
Je salue par Gareth lambda code. Très élégante. J'ai seulement la moitié de comprendre comment il fonctionne bien. J'ai donc essayé de le désassembler et est venu avec cette:
Gareth code exprimée à l'aide de la moderne .format()
Il y a un nombre ordinal de la fonction dans humaniser
pip install humanize