Làm cách nào để tăng một ký tự?


103

Tôi mới làm quen với Python, đến từ Java và C. Làm cách nào để tăng một ký tự? Trong Java hoặc C, các ký tự và int thực tế có thể hoán đổi cho nhau và trong một số vòng lặp nhất định, tôi rất hữu ích khi có thể thực hiện các ký tự tăng dần và lập chỉ mục mảng theo ký tự.

Làm cách nào tôi có thể làm điều này bằng Python? Thật tệ khi không có một vòng lặp for (;;) truyền thống - có cách nào tôi có thể đạt được những gì tôi muốn đạt được mà không cần phải suy nghĩ lại toàn bộ chiến lược của mình không?


4
Truyền thống forvòng lặp: for i in range(50): do_something_with(i). Cố lên, điều đó không tệ lắm đâu !!
jathanism

@SilentGhost: Tôi đang chia nhỏ một từ điển tiếng Anh để sử dụng trong ứng dụng Android. Bởi vì tệp riêng lẻ quá lớn, tôi đã viết một tập lệnh Python để chia chúng thành words_aa.txt, words_ab.txt, v.v. Tôi cần viết tập lệnh thứ hai để tạo tệp Java với một mảng chứa các Id tài nguyên tệp thô của mỗi tệp word (vì tôi lười) và tôi không thể nghĩ ra cách tốt hơn để làm điều đó.
Tom R

3
bạn dường như đang tìm kiếm thứ gì đó giống như[''.join(i) for i in itertools.product(string.ascii_lowercase, repeat=2)]
SilentGhost

1
@SilentGhost: Đó là tất cả những gì cần thiết? Giá như nó nói trong sách hướng dẫn.
Tom R

Câu trả lời:


178

Trong Python 2.x, chỉ cần sử dụng các hàm ordchr:

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

Python 3.x làm cho điều này có tổ chức và thú vị hơn, do sự phân biệt rõ ràng giữa byte và unicode. Theo mặc định, một "chuỗi" là unicode, do đó, các lệnh trên hoạt động ( ordnhận các ký tự Unicode và chrtạo ra chúng).

Nhưng nếu bạn quan tâm đến byte (chẳng hạn như để xử lý một số luồng dữ liệu nhị phân), mọi thứ thậm chí còn đơn giản hơn:

>>> 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. Đừng! [nhớ những ngày cũ]. Khi bạn đang cố gắng nhanh chóng đạt được điều gì đó hoặc chuyển đổi một đoạn mã, các khái niệm và thành ngữ của Python dường như chỉ cản trở sự tiến bộ của bạn và khó có giá trị học tập ... Hãy kiên nhẫn! Bạn thậm chí có thể thấy rằng việc thành thạo Python sẽ cải thiện phong cách của bạn trong Java (và C, ở mức độ thấp hơn).
mjv

làm việc như người ở. <br> Thay đổi duy nhất tôi muốn làm là đối với z, trong trường hợp đó, tôi đã chỉ định 'a'.
dùng45949

15

"đủ tệ khi không có vòng lặp for (;;) truyền thống" ?? Gì?

Bạn đang cố gắng làm

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

Hoặc có lẽ bạn đang sử dụng string.uppercasehoặc string.letters?

Python không có for(;;)vì thường có nhiều cách tốt hơn để làm điều đó. Nó cũng không có phép toán ký tự vì nó cũng không cần thiết.


1
+1 vì cố gắng trả lời câu hỏi đằng sau câu hỏi (vấn đề XY, v.v.). Nếu có thể, tôi sẽ cho bạn nhiều hơn nữa.
Devin Jeanpierre

Cảm ơn. Đầu tiên tôi thường hỏi "tại sao?" cho những câu hỏi như thế này. Nhưng @SilentGhost đã đánh bại tôi.
S.Lott

3

Tôi đến từ PHP, nơi bạn có thể tăng char (A thành B, Z thành AA, AA thành AB, v.v.) bằng cách sử dụng toán tử ++. Tôi đã tạo một hàm đơn giản làm tương tự trong Python. Bạn cũng có thể thay đổi danh sách các ký tự thành bất kỳ thứ gì (chữ thường, chữ hoa, v.v.) theo nhu cầu của bạn.

# 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

Có một cách để tăng ký tự bằng cách sử dụng ascii_letterstừ stringgói ascii_letterslà một chuỗi chứa tất cả bảng chữ cái tiếng Anh, chữ hoa và chữ thường:

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

Ngoài ra nó có thể được thực hiện thủ công;

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

1

Kiểm tra cái này: SỬ DỤNG ĐỂ LOOP

for a in range(5): x='A' val=chr(ord(x)+a) print(val)
ĐẦU RA: ABCBDE


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

print(doubleChar("amar"))

đầu ra:

aammaarr
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.