2009-02-05 50 views
9

在Python(特别是Python 3.0,但我不认为它很重要)中,如何轻松地在具有连续字符代码的字符序列上编写循环?我想要做这样的事伪代码:Python:循环连续的字符?

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

举例:怎么样以下的一个很好的“Python化”的版本?

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) # 

标记#的行是伪代码。当然,reduce()是真正的Python!亲爱的巫师们(特别老,灰胡须的巫师),也许你可以说我最喜欢的语言曾经是帕斯卡尔。

回答

35

你有一个叫ascii_lowercase串模块中的常量,尝试了这一点:

>>> from string import ascii_lowercase 

然后你就可以在该字符串中的字符进行迭代。

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

为了您的全字母短句的问题,还有就是找出一个字符串包含字母的所有字母一个非常简单的方法。像以前一样使用ascii_lowercase,

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

我希望你的胡子是可以接受的OP :) – llimllib 2009-02-05 04:00:22

+0

如果我也得做个向导,我会用胡子生活:) – sykora 2009-02-05 04:10:25

+0

你也可以使用<=来检查set是否是子集:set(ascii_lowercase)<= set(str) – Moshe 2012-12-03 19:30:36

8

用你需要的所有字符迭代一个常量就是Pythonic。但是,如果您不想导入任何内容并且只能使用Unicode,请使用内置的ord()及其反转chr()。

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

我会写类似Python的range

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

你要离开背后的帕斯卡主义和学习Python用一个全新的视角的功能。

>>> ascii_lowercase 
'abcdefghijklmnopqrstuvwxyz' 
>>> def pangram(source): 
    return all(c in source for c in ascii_lowercase) 

>>> pangram('hi mom') 
False 
>>> pangram(ascii_lowercase) 
True 

通过限制自己Pascal提供的内容,您错过了Python提供的东西。

而且...尽量避免reduce。它经常导致可怕的性能问题。


编辑。这是另一个表述;这个实现了集交集。

>>> def pangram(source): 
>>>  notused= [ c for c in ascii_lowercase if c not in source ] 
>>>  return len(notused) == 0 

这一个给你一个诊断信息,以确定什么字母是从候选人pangram丢失。

1

一个更抽象的答案是这样的:

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