文字を超えて範囲を変更する方法はありますか?このようなもの。
for c in xrange( 'a', 'z' ):
print c
皆さんが助けてくれることを願っています。
これは、カスタムジェネレーターの優れた用途です。
Python 2:
def char_range(c1, c2):
"""Generates the characters from `c1` to `c2`, inclusive."""
for c in xrange(ord(c1), ord(c2)+1):
yield chr(c)
その後:
for c in char_range('a', 'z'):
print c
Python 3:
def char_range(c1, c2):
"""Generates the characters from `c1` to `c2`, inclusive."""
for c in range(ord(c1), ord(c2)+1):
yield chr(c)
その後:
for c in char_range('a', 'z'):
print(c)
import string
for char in string.ascii_lowercase:
print char
大文字、数字、ロケール依存の文字など、他の可能性については string constants を参照してください。複数のセットのすべての文字が必要な場合は、string.ascii_uppercase + string.ascii_lowercase
のように結合できます。
文字を数字に変換して、元に戻す必要があります。
for c in xrange(ord('a'), ord('z')+1):
print chr(c) # resp. print unicode(c)
美しさと読みやすさのために、これをジェネレーターでラップできます。
def character_range(a, b, inclusive=False):
back = chr
if isinstance(a,unicode) or isinstance(b,unicode):
back = unicode
for c in xrange(ord(a), ord(b) + int(bool(inclusive)))
yield back(c)
for c in character_range('a', 'z', inclusive=True):
print(chr(c))
このジェネレーターは、inclusive=False
(デフォルト)で呼び出してPythonの通常の動作を模倣して終了要素を除外するか、inclusive=True
(デフォルト)で呼び出して含めることができます。したがって、デフォルトのinclusive=False
では、'a', 'z'
はa
を除くy
からz
の範囲になります。
a
、b
のいずれかがユニコードの場合、ユニコードで結果を返します。それ以外の場合は、chr
を使用します。
現在(おそらく)Py2でのみ動作します。
文字の短い固定リストがある場合は、Pythonの文字列のリストとしての処理を使用します。
for x in 'abcd':
print x
または
[x for x in 'abcd']
for character in map( chr, xrange( ord('a'), ord('c')+1 ) ):
print character
プリント:
a
b
c
# generating 'a to z' small_chars.
small_chars = [chr(item) for item in range(ord('a'), ord('z')+1)]
# generating 'A to Z' upper chars.
upper_chars = [chr(item).upper() for item in range(ord('a'), ord('z')+1)]
上記のトップ記事からインスピレーションを得て、私はこれを思いつきました:
map(chr,range(ord('a'),ord('z')+1))
同じニーズがあり、これを使用しました:
chars = string.ascii_lowercase
range = list(chars)[chars.find('a'):chars.find('k')+1]
これが誰かを助けることを願っています
ここで@ ned-batchelderの答えを使用して、python3
def char_range(c1, c2):
"""Generates the characters from `c1` to `c2`, inclusive."""
"""Using range instead of xrange as xrange is deprecated in Python3"""
for c in range(ord(c1), ord(c2)+1):
yield chr(c)
それから、ネッドの答えと同じこと:
for c in char_range('a', 'z'):
print c
ありがとう、ネッド!
別のオプション(範囲のように動作します-停止を含めたい場合は停止するために1を追加します)
>>> import string
>>> def crange(arg, *args):
... """character range, crange(stop) or crange(start, stop[, step])"""
... if len(args):
... start = string.ascii_letters.index(arg)
... stop = string.ascii_letters.index(args[0])
... else:
... start = string.ascii_letters.index('a')
... stop = string.ascii_letters.index(arg)
... step = 1 if len(args) < 2 else args[1]
... for index in range(start, stop, step):
... yield string.ascii_letters[index]
...
>>> [_ for _ in crange('d')]
['a', 'b', 'c']
>>>
>>> [_ for _ in crange('d', 'g')]
['d', 'e', 'f']
>>>
>>> [_ for _ in crange('d', 'v', 3)]
['d', 'g', 'j', 'm', 'p', 's']
>>>
>>> [_ for _ in crange('A', 'G')]
['A', 'B', 'C', 'D', 'E', 'F']
リスト内包表記を使用する:
for c in [chr(x) for x in range(ord('a'), ord('z'))]:
print c
「範囲内のカウントに」およびchr&ordを使用します。
print [chr(ord('a')+i) for i in range(ord('z')-ord('a'))]