Bir karakteri nasıl artırabilirim?


104

Python'da yeniyim, Java ve C'den geliyorum. Bir karakteri nasıl artırabilirim? Java veya C'de, karakterler ve inçler pratik olarak birbirinin yerine kullanılabilir ve belirli döngülerde karakterleri artırıp dizileri karakterlere göre indeksleyebilmek benim için çok yararlıdır.

Bunu Python'da nasıl yapabilirim? (;;) için geleneksel bir döngü yapıcıya sahip olmamak yeterince kötü - tüm stratejimi yeniden düşünmek zorunda kalmadan başarmak istediğim şeyi başarmanın bir yolu var mı?


4
Geleneksel fordöngü: for i in range(50): do_something_with(i). Hadi, o kadar kötü değil !!
jathanizm

@SilentGhost: Bir Android uygulamasında kullanmak için bir İngilizce sözlüğü bölüyorum. Dosya tek tek çok büyük olduğu için, onları word_aa.txt, words_ab.txt, vb. Olarak ayırmak için bir Python betiği yazdım ... Ids içeren bir dizi ile bir Java dosyası oluşturmak için ikinci bir betik yazmam gerekiyordu her bir kelime dosyasının ham dosya kaynakları hakkında (çünkü tembelim) ve bunu yapmanın daha iyi bir yolunu düşünemedim.
Tom R

3
Gibi bir şey arıyor görünüyorsunuz[''.join(i) for i in itertools.product(string.ascii_lowercase, repeat=2)]
SilentGhost

1
@SilentGhost: Hepsi bu kadar mı? El kitabında sadece söylendi.
Tom R

Yanıtlar:


180

Python 2.x'te ordve chrişlevlerini kullanın :

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

Python 3.x, bayt ve unicode arasındaki açık fark nedeniyle bunu daha düzenli ve ilginç hale getirir. Varsayılan olarak, bir "dizge" unicode'dur, bu nedenle yukarıdaki çalışır ( ordUnicode karakterleri alır ve chrbunları üretir).

Ancak baytlarla ilgileniyorsanız (örneğin, bazı ikili veri akışlarını işlemek için), işler daha da basittir:

>>> 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
@Tom R. Yapma! [eski günleri özlüyorum]. Hızlı bir şekilde bir şeyi başarmaya veya bir kod parçasını dönüştürmeye çalışırken, Python'un kavramları ve deyimleri ilerlemenizi engelliyor gibi görünebilir ve öğrenme eğrisine pek değmez ... Sabırlı olun! Python'da yeterlilik kazanmanın Java'daki stilinizi (ve daha az ölçüde C) geliştireceğini bile görebilirsiniz.
mjv

bir cazibe gibi çalıştı. <br> Yapacağım tek değişiklik z için, bu durumda bir 'a' atadım.
user45949

15

"(;;) için geleneksel bir döngü yapıcı olmaması yeterince kötü" ?? Ne?

Yapmaya mı çalışıyorsun

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

Ya da belki kullandığınız string.uppercaseya string.letters?

Python'da yoktur for(;;)çünkü bunu yapmanın genellikle daha iyi yolları vardır. Ayrıca karakter matematiği de yoktur çünkü gerekli değildir.


1
Sorunun arkasındaki soruyu cevaplamaya çalışmak için +1 (XY problemi vb.). Eğer yapabilseydim, sana daha fazlasını verirdim.
Devin Jeanpierre

Teşekkürler. Sık sık "neden" diye ilk sorarım bunun gibi sorular için. Ama @SilentGhost beni yendi.
S. Lot

3

Ben, ++ operatörü kullanarak char'ı (A'dan B'ye, Z'den AA'ya, AA'dan AB'ye vb.) Artırabileceğiniz PHP'den geldim. Python'da da aynı şeyi yapan basit bir işlev yaptım. İhtiyacınız olan karakter listesini de (küçük harf, büyük harf vb.) Değiştirebilirsiniz.

# 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

Kullanarak karakteri artırmak için bir yol yoktur ascii_lettersden stringhangi paketin ascii_letters, tüm İngilizce alfabesi içeren büyük ve küçük bir dizedir:

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

Ayrıca manuel olarak da yapılabilir;

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

1

Şunu kontrol edin: DÖNGÜ İÇİN KULLANMA

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


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

print(doubleChar("amar"))

çıktı:

aammaarr
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.