2009-02-05 122 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]