Wie kann ich ein Zeichen erhöhen?

103

Ich bin neu in Python und komme aus Java und C. Wie kann ich ein Zeichen erhöhen? In Java oder C sind Zeichen und Ints praktisch austauschbar, und in bestimmten Schleifen ist es für mich sehr nützlich, Zeichen inkrementieren und Arrays nach Zeichen indizieren zu können.

Wie kann ich das in Python machen? Es ist schon schlimm genug, keinen traditionellen (;;) Looper zu haben - gibt es eine Möglichkeit, das zu erreichen, was ich erreichen möchte, ohne meine gesamte Strategie überdenken zu müssen?

An Herrn
quelle
4
Traditionelle forSchleife : for i in range(50): do_something_with(i). Komm schon, das ist nicht so schlimm !!
Nathanismus
@ SilentGhost: Ich teile ein englisches Wörterbuch für die Verwendung in einer Android-App auf. Da die Datei einzeln zu groß ist, habe ich ein Python-Skript geschrieben, um sie in words_aa.txt, words_ab.txt usw. aufzuteilen. Ich musste ein zweites Skript schreiben, um eine Java-Datei mit einem Array zu generieren, das die IDs enthält von den Rohdateiressourcen jeder Wortdatei (weil ich faul bin), und ich könnte mir keinen besseren Weg vorstellen, dies zu tun.
Tom R
3
Sie scheinen nach etwas zu suchen wie[''.join(i) for i in itertools.product(string.ascii_lowercase, repeat=2)]
SilentGhost
1
@ SilentGhost: Ist das alles was es braucht? Wenn es nur im Handbuch steht.
Tom R

Antworten:

178

Verwenden Sie in Python 2.x einfach die Funktionen ordund chr:

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

Python 3.x macht dies aufgrund seiner klaren Unterscheidung zwischen Bytes und Unicode organisierter und interessanter. Standardmäßig ist eine "Zeichenfolge" Unicode, daher funktioniert das oben Gesagte ( ordempfängt Unicode-Zeichen und chrerzeugt sie).

Wenn Sie jedoch an Bytes interessiert sind (z. B. für die Verarbeitung eines binären Datenstroms), sind die Dinge noch einfacher:

>>> 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'
Eli Bendersky
quelle
5
@ Tom R. Nicht! [Die alten Zeiten vermissen]. Wenn Sie versuchen, schnell etwas zu erreichen oder einen Teil des Codes zu konvertieren, scheinen Konzepte und Redewendungen von Python Ihren Fortschritt nur zu behindern und die Lernkurve kaum wert zu sein ... Seien Sie geduldig! Möglicherweise stellen Sie sogar fest, dass das Erlernen von Python Ihren Stil in Java (und in geringerem Maße in C) verbessert.
mjv
Lief wie am Schnürchen. <br> Die einzige Änderung, die ich vornehmen würde, ist für z. In diesem Fall habe ich ein 'a' zugewiesen.
user45949
15

"Schlimm genug, keinen traditionellen (;;) Looper zu haben" ?? Was?

Versuchst du es zu tun?

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

Oder vielleicht benutzt du string.uppercaseoder string.letters?

Python hat keine, for(;;)weil es oft bessere Möglichkeiten gibt, dies zu tun. Es gibt auch keine Charaktermathematik, da dies auch nicht erforderlich ist.

S.Lott
quelle
1
+1 für den Versuch, die Frage hinter der Frage zu beantworten (XY-Problem usw.). Wenn ich könnte, würde ich dir mehr geben.
Devin Jeanpierre
Vielen Dank. Ich frage oft zuerst "warum?" für Fragen wie diese. Aber @SilentGhost hat mich geschlagen.
S.Lott
3

Ich komme aus PHP, wo Sie char (A nach B, Z nach AA, AA nach AB usw.) mit dem Operator ++ erhöhen können. Ich habe eine einfache Funktion erstellt, die in Python dasselbe tut. Sie können die Liste der Zeichen auch nach Belieben ändern (Kleinbuchstaben, Großbuchstaben usw.).

# 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
xpuu
quelle
2

Es gibt eine Möglichkeit, das Zeichen mithilfe ascii_lettersdes stringPakets zu erhöhen. Hierbei handelt ascii_letterses sich um eine Zeichenfolge, die alle englischen Buchstaben, Groß- und Kleinbuchstaben enthält:

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

Es kann auch manuell erfolgen;

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

Überprüfen Sie dies: USING FOR LOOP

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

Jaydeep_GAME
quelle
0
def doubleChar(str):
    result = ''
    for char in str:
        result += char * 2
    return result

print(doubleChar("amar"))

Ausgabe:

aammaarr
Amar Tanwar
quelle