charをインクリメントするにはどうすればよいですか?


103

Pythonは初めてで、JavaとCから来ています。charをインクリメントするにはどうすればよいですか?JavaまたはCでは、charとintは実質的に交換可能であり、特定のループでは、charをインクリメントしたり、charで配列にインデックスを付けたりできると非常に便利です。

Pythonでこれを行うにはどうすればよいですか?従来のfor(;;)ルーパーがないことは十分に悪いことです。戦略全体を再考する必要なしに、達成したいことを達成する方法はありますか?


4
従来のforループ: for i in range(50): do_something_with(i)。さあ、そんなに悪くない!
ジェサニズム

@SilentGhost:Androidアプリで使用するために英語の辞書を分割しています。ファイルが個別に大きすぎるため、それらをwords_aa.txt、words_ab.txtなどに分割するPythonスクリプトを作成しました。Idsを含む配列を含むJavaファイルを生成するために、2つ目のスクリプトを作成する必要がありました。 (私は怠惰なため)各単語ファイルの生のファイルリソースの、そして私はそれを行うためのより良い方法を考えることができませんでした。
トムR

3
あなたは次のようなものを探しているようです[''.join(i) for i in itertools.product(string.ascii_lowercase, repeat=2)]
SilentGhost 2010年

1
@SilentGhost:それで十分ですか?マニュアルに書いてあるだけなら。
トムR

回答:


178

Python 2.xでは、ordおよびchr関数を使用するだけです。

>>> ord('c')
99
>>> ord('c') + 1
100
>>> chr(ord('c') + 1)
'd'
>>> 

Python 3.xでは、バイトとユニコードが明確に区別されているため、これがより整理された興味深いものになっています。デフォルトでは、「文字列」はユニコードなので、上記は機能します(ordユニコード文字を受け取ってchr生成します)。

しかし、バイトに関心がある場合(バイナリデータストリームの処理など)、さらに簡単になります。

>>> bstr = bytes('abc', 'utf-8')
>>> bstr
b'abc'
>>> bstr[0]
97
>>> bytes([97, 98, 99])
b'abc'
>>> bytes([bstr[0] + 1, 98, 99])
b'bbc'

5
@トムR.しないでください![昔懐かしい]。何かをすばやく達成したり、コードの一部を変換しようとしているとき、Pythonの概念やイディオムは単に進捗を妨げているように見え、学習曲線に値することはほとんどありません...我慢してください!Pythonに習熟すると、Javaのスタイルが向上する(そしてCはそれほどではない)場合もあります。
mjv 2010年

魅力のように働いた。<br>変更するのはzのみです。その場合、「a」を割り当てました。
user45949 2014年

15

「伝統的なfor(;;)ルーパーが十分にない」??? 何?

あなたはやろうとしている

import string
for c in string.lowercase:
    ...do something with c...

または多分あなたは使用していますstring.uppercasestring.letters

Python for(;;)には多くの場合より優れた方法があるため、Pythonにはありません。また、必要がないため、文字演算もありません。


1
質問の背後にある質問(XY問題など)に回答しようとする場合の+1。できればもっとあげます。
Devin Jeanpierre

ありがとう。私はしばしば「なぜ?」と最初に尋ねます。このような質問のために。しかし、@ SilentGhostは私を打ち負かしました。
S.Lott、2010年

3

私はPHPから来ましたが、++演算子を使用してchar(AからB、ZからAA、AAからABなど)をインクリメントできます。Pythonで同じことを行う単純な関数を作成しました。文字のリストを必要に応じて(小文字、大文字など)変更することもできます。

# Increment char (a -> b, az -> ba)
def inc_char(text, chlist = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'):
    # Unique and sort
    chlist = ''.join(sorted(set(str(chlist))))
    chlen = len(chlist)
    if not chlen:
        return ''
    text = str(text)
    # Replace all chars but chlist
    text = re.sub('[^' + chlist + ']', '', text)
    if not len(text):
        return chlist[0]
    # Increment
    inc = ''
    over = False
    for i in range(1, len(text)+1):
        lchar = text[-i]
        pos = chlist.find(lchar) + 1
        if pos < chlen:
            inc = chlist[pos] + inc
            over = False
            break
        else:
            inc = chlist[0] + inc
            over = True
    if over:
        inc += chlist[0]
    result = text[0:-len(inc)] + inc
    return result

2

大文字と小文字のすべての英語のアルファベットを含む文字列であるパッケージascii_lettersから文字を増やす方法があります。stringascii_letters

>>> from string import ascii_letters
>>> ascii_letters[ascii_letters.index('a') + 1]
'b'
>>> ascii_letters
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'

また、手動で行うこともできます。

>>> letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> letters[letters.index('c') + 1]
'd'

1

これを確認してください:ループの使用

for a in range(5): x='A' val=chr(ord(x)+a) print(val)
出力:ABCBDE


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.