2009-02-05 9 views
9

En Python (spécifiquement Python 3.0 mais je ne pense pas que cela soit important), comment écrire facilement une boucle sur une séquence de caractères ayant des codes de caractères consécutifs? Je veux faire quelque chose comme ça pseudocode:Python: boucle sur des caractères consécutifs?

for Ch from 'a' to 'z' inclusive: # 
    f(Ch) 

Exemple: Que diriez-vous d'une belle version « pythonique » de ce qui suit?

def Pangram(Str): 
    ''' Returns True if Str contains the whole alphabet, else False ''' 
    for Ch from 'a' to 'z' inclusive: # 
     M[Ch] = False 
    for J in range(len(Str)): 
     Ch = lower(Str[J]) 
     if 'a' <= Ch <= 'z': 
      M[Ch] = True 
    return reduce(and, M['a'] to M['z'] inclusive) # 

Les lignes marquées # sont des pseudocodes. Bien sûr, reduce() est un vrai Python!

Chers sorciers (particulièrement vieux, sorciers à la barbe grise), vous pouvez peut-être dire que ma langue préférée était Pascal.

Répondre

35

Vous avez une constante dans le module de chaîne appelée ascii_lowercase, essayer cela:

>>> from string import ascii_lowercase 

Ensuite, vous pouvez parcourir les caractères dans cette chaîne.

>>> for i in ascii_lowercase : 
...  f(i) 

Pour votre question pangram, il existe un moyen très simple de savoir si une chaîne contient toutes les lettres de l'alphabet. Utilisation de ascii_lowercase comme avant,

>>> def pangram(str) : 
...  return set(ascii_lowercase).issubset(set(str)) 
+0

J'espère acceptable pour l'OP de votre barbe :) – llimllib

+0

Si je reçois aussi d'être un assistant, je vais vivre avec la barbe :) – sykora

+0

Vous peut aussi utiliser <= pour vérifier si les ensembles sont des sous-ensembles: set (ascii_lowercase) <= set (str) – Moshe

8

L'itération d'une constante avec tous les caractères dont vous avez besoin est très Pythonique. Cependant, si vous ne voulez rien importer et que vous travaillez uniquement en Unicode, utilisez la commande ord() et son inverse chr().

for code in range(ord('a'), ord('z') + 1): 
    print chr(code) 
+0

La version Unicode de chr() est unichr() –

+0

Encore une chose: si vous voulez que la plage soit inclusive, faites > >> pour code dans la plage (ord ('a'), ord ('z') + 1): \t impression unichr (code) –

+1

déconseiller d'importer à partir de la norme lib – hop

0

Je voudrais écrire une fonction similaire à range de Python

def alpha_range(*args): 
    if len(args) == 1: 
    start, end, step = ord('a'), ord(args[0]), 1 
    elif len(args) == 2: 
    start, end, step = ord(args[0]), ord(args[1]), 1 
    else: 
    start, end, step = ord(args[0]), ord(args[1]), args[2] 
    return (chr(i) for i in xrange(start, end, step)) 
6

Vous devez laisser les Pascal-ismes derrière et apprendre Python avec une nouvelle perspective. En vous limitant à ce que Pascal vous offre, il vous manque les choses qu'offre Python en vous limitant à ce que Pascal vous proposait. Pour éviter reduce. Cela conduit souvent à de terribles problèmes de performance.


Modifier. Voici une autre formulation; celui-ci implémente l'intersection définie. Celui-ci vous donne une information de diagnostic pour déterminer quelles lettres manquent dans un pangram candidat.

+0

Désolé, les expressions de générateur sont dans 2.4 et plus, pas 2.3 – hop

+0

@hop: Je ne reçois pas le commentaire. Le changement de code semble bien, mais le commentaire est opaque. –

+0

@ s.lott: j'ai écrit dans le commentaire sur le changement lui-même que GE fonctionne dans 2.3+ – hop

1

Une réponse plus abstraite serait quelque chose comme:

>>> x="asdf" 
>>> for i in range(len(x)): 
...  print x[i] 
Questions connexes