在Python(特别是Python 3.0,但我认为不重要)中,如何在具有连续字符代码的字符序列上轻松编写循环?我想做这样的伪代码:
for Ch from 'a' to 'z' inclusive: #
f(Ch)
示例:以下是一个不错的“pythonic”版本怎么样?
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!
亲爱的巫师(特别是古老的灰胡子巫师),也许你可以说我最喜欢的语言曾经是帕斯卡。
答案 0 :(得分:36)
你在名为ascii_lowercase
的字符串模块中有一个常量,试试看:
>>> from string import ascii_lowercase
然后你可以遍历该字符串中的字符。
>>> for i in ascii_lowercase :
... f(i)
对于你的pangram问题,有一种非常简单的方法可以找出一个字符串是否包含字母表中的所有字母。像以前一样使用ascii_lowercase,
>>> def pangram(str) :
... return set(ascii_lowercase).issubset(set(str))
答案 1 :(得分:10)
使用你需要的所有字符迭代常量非常Pythonic。但是,如果您不想导入任何内容并且仅使用Unicode,请使用内置函数ord()及其反向chr()。
for code in range(ord('a'), ord('z') + 1):
print chr(code)
答案 2 :(得分:6)
你必须抛弃Pascal-isms并以全新的视角学习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中缺少哪些字母。
答案 3 :(得分:2)
更抽象的答案是:
>>> x="asdf"
>>> for i in range(len(x)):
... print x[i]
答案 4 :(得分:1)
对此的一个 Liner 解决方案是使用列表理解
print([chr(x) for x in range(ord('a'), ord('z')+1)])
答案 5 :(得分: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))