Jak mogę zwiększyć postać?

104

Jestem nowy w Pythonie, pochodzę z Java i C. Jak mogę zwiększyć liczbę znaków? W Javie lub C znaki i int są praktycznie wymienne, aw niektórych pętlach bardzo przydatne jest dla mnie możliwość inkrementacji znaków i indeksowania tablic według znaków.

Jak mogę to zrobić w Pythonie? Wystarczająco źle jest brak tradycyjnego pętli for (;;) - czy jest jakiś sposób, aby osiągnąć to, co chcę, bez konieczności ponownego przemyślenia całej strategii?

Do Pana
źródło
4
Tradycyjna forpętla: for i in range(50): do_something_with(i). No dalej, to nie jest takie złe !!
jathanism
@SilentGhost: Dzielę słownik języka angielskiego do użytku w aplikacji na Androida. Ponieważ pojedynczy plik jest zbyt duży, napisałem skrypt Pythona, aby podzielić je na words_aa.txt, words_ab.txt, etc ... Potrzebowałem napisać drugi skrypt, aby wygenerować plik Java z tablicą zawierającą identyfikatory surowych zasobów każdego pliku słów (ponieważ jestem leniwy) i nie mogłem wymyślić lepszego sposobu na zrobienie tego.
Tom R
3
wydaje się, że szukasz czegoś takiego[''.join(i) for i in itertools.product(string.ascii_lowercase, repeat=2)]
SilentGhost
1
@SilentGhost: Czy to wszystko? Gdyby tylko tak powiedział w instrukcji.
Tom R

Odpowiedzi:

180

W Pythonie 2.x wystarczy użyć funkcji ordi chr:

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

Python 3.x sprawia, że ​​jest to bardziej zorganizowane i interesujące ze względu na wyraźne rozróżnienie między bajtami i Unicode. Domyślnie „string” to unicode, więc powyższe działa ( ordodbiera znaki Unicode i chrtworzy je).

Ale jeśli interesują Cię bajty (na przykład do przetwarzania strumienia danych binarnych), sprawa jest jeszcze prostsza:

>>> 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
źródło
5
@Tom R. Don't! [tęsknie za starymi czasami]. Gdy próbujesz szybko coś osiągnąć lub przekonwertować fragment kodu, koncepcje i idiomy Pythona mogą wydawać się jedynie utrudniać postęp i nie są warte nauki ... Bądź cierpliwy! Może się nawet okazać, że opanowanie języka Python poprawi Twój styl w Javie (i w mniejszym stopniu C).
mjv
działał jak urok. <br> Jedyną zmianą, jaką wprowadziłbym, jest z, w którym to przypadku przypisałem „a”.
user45949
15

„wystarczająco źle, że nie ma tradycyjnego (;;) looper” ?? Co?

Próbujesz to zrobić

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

A może używasz string.uppercaselub string.letters?

Python nie ma, for(;;)ponieważ często istnieją lepsze sposoby na zrobienie tego. Nie ma również matematyki postaci, ponieważ nie jest to konieczne.

S.Lott
źródło
1
+1 za próbę odpowiedzi na pytanie kryjące się za pytaniem (problem XY itd.). Gdybym mógł, dałbym ci więcej.
Devin Jeanpierre
Dzięki. Często jako pierwszy pytam „dlaczego?” na takie pytania. Ale @SilentGhost pokonał mnie.
S.Lott
3

Pochodzę z PHP, gdzie można inkrementować znaki (A do B, Z do AA, AA do AB itp.) Za pomocą operatora ++. Zrobiłem prostą funkcję, która robi to samo w Pythonie. Możesz także zmienić listę znaków na dowolną (małe, duże, itp.), Której potrzebujesz.

# 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
źródło
2

Istnieje sposób na zwiększenie znaku za pomocą ascii_lettersfrom stringpackage, który ascii_lettersjest ciągiem zawierającym cały angielski alfabet, wielkie i małe litery:

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

Można to również zrobić ręcznie;

>>> letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> letters[letters.index('c') + 1]
'd'
Moein Kameli
źródło
1

Sprawdź to: UŻYWANIE PĘTLI

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

Jaydeep_GAME
źródło
0
def doubleChar(str):
    result = ''
    for char in str:
        result += char * 2
    return result

print(doubleChar("amar"))

wynik:

aammaarr
Amar Tanwar
źródło