15

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 です!

親愛なる魔法使いの皆さん (特に年老いた灰色のひげを生やした魔法使いの皆さん)、私のお気に入りの言語は以前は Pascal だったことがお分かりいただけると思います。

4

6 に答える 6

44

という文字列モジュールに定数があります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))
于 2009-02-05T03:47:46.843 に答える
19

必要なすべての文字で定数を反復することは、非常に Pythonic です。ただし、何もインポートする必要がなく、Unicode でのみ作業している場合は、組み込みの ord() とその逆 chr() を使用してください。

for code in range(ord('a'), ord('z') + 1):
     print chr(code)
于 2009-02-05T04:04:39.540 に答える
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

これは、候補パングラムから欠落している文字を判別するための診断情報を提供します。

于 2009-02-05T11:00:09.790 に答える
2

より抽象的な答えは次のようになります。

>>> x="asdf"
>>> for i in range(len(x)):
...     print x[i]
于 2011-08-16T19:32:44.380 に答える
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))
于 2009-02-05T06:20:41.980 に答える