7
votes

Quel est l'équivalent python à Perl "A" .. "AZC"

en Perl, pour obtenir une liste de toutes les cordes de "A" à "AZC", à la seule chose à faire consiste à utiliser l'opérateur de gamme:

>>> [chr(c) for c in range(ord("a"), ord("z") + 1)]
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']


0 commentaires

6 Réponses :


2
votes

Utilisez l'appel du produit dans iTERTOOLS et ASCII_LETTERS de STRING.

from string import ascii_letters
from itertools import product

if __name__ == '__main__':
    values = []
    for i in xrange(1, 4):
        values += [''.join(x) for x in product(ascii_letters[:26], repeat=i)]

    print values


2 commentaires

Il devrait être ascii_loWercase et vous n'avez pas encore pris en compte l'arrêt de "AZC".


HMM, merci, ici, je peux avoir une liste de chaîne d'A à Zzz. Donc, je ferai une deuxième boucle pour copier les éléments de la première boucle au second et arrêter tout en rencontrant la chaîne "End". Je vais répondre à ma question avec un échantillon complet de code. Merci beaucoup !



0
votes
def strrange(end):
    values = []
    for i in range(1, len(end) + 1):
        values += [''.join(x) for x in product(ascii_lowercase, repeat=i)]
    return values[:values.index(end) + 1]

3 commentaires

Problèmes majeurs avec ceci: 1) Utilisation de xRange au lieu de plage . xRange n'a plus d'avantage sur plage , car plage est un générateur et ne génère pas la liste des résultats. Ainsi, xrange est obsolète et IIRC, pas même en Python 3. 2) Construction Endvalues ​​ à partir de Valeurs Lorsque vous auriez pu simplement utiliser list.index () et une opération de tranches. 3) Ce n'est pas la manière dont vous marquez les questions telles que la réponse.


@Mike, Xrange est toujours requis dans Python 2.7, qui a été publié il y a moins de 2 semaines. plage retourne toujours une liste.


J'ai mis à jour celui-ci pour utiliser des tranches et des index (). Aussi supprimé le texte d'emballage.



4
votes

Une suggestion purement basée sur les itérateurs:

import string
import itertools

def string_range(letters=string.ascii_lowercase, start="a", end="z"):
    return itertools.takewhile(end.__ne__, itertools.dropwhile(start.__ne__, (x for i in itertools.count(1) for x in itertools.imap("".join, itertools.product(letters, repeat=i)))))

print list(string_range(end="azc"))


0 commentaires

5
votes

Version génératrice: xxx

EDIT: @iHightower demande dans les commentaires:

Je n'ai aucune idée de ce que je devrais faire si je veux imprimer de 'B' à "AZC".

Vous voulez donc commencer avec autre chose que 'a' . Il suffit de supprimer quoi que ce soit avant la valeur de départ: xxx


2 commentaires

Ouais ! Certainement bien (ne peut pas voter comme je ne suis que 11 réputation, mais sonne bien!)


Pourrait être une bonne réponse ... mais, comment l'utilise-t-on ... comme un débutant ... Je n'ai aucune idée de ce que je devrais faire si je veux imprimer de 'B' à "AZC". Je répète de la lettre "B" à la lettre "AZC". La fonction peut être bonne ... mais comme débutant, je n'ai aucune idée de la façon dont je pourrais l'utiliser pour faire le travail réel et l'impression.



1
votes

Voici une meilleure façon de le faire, bien que vous ayez besoin d'une fonction de conversion: xxx

et voici votre fonction (merci wikipedia ): xxx

je suis cloué sur l'option de conversion minuscule, juste au cas où vous le souhaitiez. < / p>


0 commentaires

1
votes

J'ai généralisé la réponse acceptée pour pouvoir commencer le milieu et utiliser autre que minuscule: xxx


0 commentaires