ฉันจะเพิ่มถ่านได้อย่างไร?


104

ฉันยังใหม่กับ Python มาจาก Java และ C ฉันจะเพิ่มถ่านได้อย่างไร ใน Java หรือ C ตัวอักษรและ int สามารถใช้แทนกันได้จริงและในบางลูปมันมีประโยชน์มากสำหรับฉันที่จะสามารถสร้างอักขระที่เพิ่มขึ้นและอาร์เรย์ดัชนีด้วยอักขระได้

ฉันจะทำสิ่งนี้ใน Python ได้อย่างไร มันแย่พอที่จะไม่มีแบบดั้งเดิมสำหรับ (;;) looper - มีวิธีใดบ้างที่ฉันสามารถบรรลุสิ่งที่ฉันต้องการบรรลุโดยไม่ต้องคิดใหม่กลยุทธ์ทั้งหมดของฉัน?


4
forลูปแบบดั้งเดิม: for i in range(50): do_something_with(i). มาไม่เลวเลย !!
jathanism

@SilentGhost: ฉันกำลังแยกพจนานุกรมภาษาอังกฤษสำหรับใช้ในแอป Android เนื่องจากไฟล์ทีละไฟล์มีขนาดใหญ่เกินไปฉันจึงเขียนสคริปต์ Python เพื่อแยกเป็น word_aa.txt, word_ab.txt ฯลฯ ... ฉันต้องเขียนสคริปต์ที่สองเพื่อสร้างไฟล์ Java ด้วยอาร์เรย์ที่มี Ids ทรัพยากรไฟล์ดิบของไฟล์ word แต่ละไฟล์ (เพราะฉันขี้เกียจ) และฉันไม่สามารถคิดวิธีที่ดีกว่านี้ได้
Tom R

3
ดูเหมือนว่าคุณกำลังมองหาสิ่งที่ชอบ[''.join(i) for i in itertools.product(string.ascii_lowercase, repeat=2)]
SilentGhost

1
@SilentGhost: แค่นั้นเอง? หากมีเพียงระบุไว้ในคู่มือ
Tom R

คำตอบ:


180

ใน Python 2.x เพียงแค่ใช้ordand chrfunctions:

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

Python 3.x ทำให้สิ่งนี้เป็นระเบียบและน่าสนใจยิ่งขึ้นเนื่องจากความแตกต่างที่ชัดเจนระหว่างไบต์และยูนิโคด ตามค่าเริ่มต้น "สตริง" คือ Unicode ดังนั้นข้างต้นจึงใช้งานordได้( รับ Unicode chars และ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
@ ทอมอาร์อย่า! [คิดถึงวันเก่า ๆ ]. ในขณะที่คุณกำลังพยายามทำบางสิ่งบางอย่างอย่างรวดเร็วหรือแปลงรหัสแนวคิดและสำนวนของ Python อาจดูเหมือนเป็นเพียงอุปสรรคต่อความก้าวหน้าของคุณและแทบจะไม่คุ้มค่ากับช่วงการเรียนรู้ ... อดทนหน่อย! คุณอาจพบว่าการได้รับความเชี่ยวชาญใน Python จะช่วยปรับปรุงสไตล์ของคุณใน Java (และ C ในระดับที่น้อยกว่า)
mjv

ทำงานเหมือนมีเสน่ห์ <br> การเปลี่ยนแปลงเพียงอย่างเดียวที่ฉันทำคือสำหรับ z ซึ่งในกรณีนี้ฉันได้กำหนด "a"
user45949

15

"แย่พอที่จะไม่มีแบบดั้งเดิมสำหรับ (;;) looper" ?? อะไร?

คุณกำลังพยายามทำ

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

หรือบางทีคุณกำลังใช้ string.uppercaseหรือstring.letters?

Python ไม่มีfor(;;)เพราะมักจะมีวิธีที่ดีกว่านี้ นอกจากนี้ยังไม่มีคณิตศาสตร์อักขระเพราะไม่จำเป็นเช่นกัน


1
+1 สำหรับพยายามตอบคำถามที่อยู่เบื้องหลังคำถาม (ปัญหา XY เป็นต้น) ถ้าทำได้ฉันจะให้มากกว่านี้
Devin Jeanpierre

ขอบคุณ. ฉันมักจะถามก่อนว่า "ทำไม" สำหรับคำถามเช่นนี้ แต่ @SilentGhost เอาชนะฉันไปได้
ล็อต

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จากstringแพ็คเกจซึ่งascii_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'


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.