2010-05-14 42 views
5

cách đơn giản để tăng độ dài của chuỗi thành số nguyên tùy ý x là gì? như 'a' đi tới 'z' và sau đó chuyển đến 'aa' thành 'zz' thành 'aaa', v.v.tăng kích thước chuỗi qua vòng

+0

'x' ở đâu? Giống như nếu chuỗi là "abc" và 'x' là 4, chuỗi sẽ trở thành" abg "? –

+0

oops. tôi có nghĩa là để nói chuỗi trở thành x dài, vì vậy nếu x = 4, các chuỗi sẽ là 'aaaa' ... 'zzzz' – calccrypto

+0

Hơi liên quan, xem [mã này golf] (http://stackoverflow.com/questions/ 2634427/code-golf-số-tương đương-of-an-excel-column-name /). –

Trả lời

6

Điều đó sẽ làm các trick:

def iterate_strings(n): 
    if n <= 0: 
     yield '' 
     return 
    for c in string.ascii_lowercase: 
     for s in iterate_strings(n - 1): 
      yield c + s 

Nó trả về một máy phát điện. Bạn có thể lặp lại điều đó với một vòng lặp for:

for s in iterate_strings(5) 

Hoặc có được một danh sách các chuỗi:

list(iterate_strings(5)) 

Nếu bạn muốn để lặp qua chuỗi ngắn quá, bạn có thể sử dụng chức năng này:

def iterate_strings(n): 
    yield '' 
    if n <= 0: 
     return 
    for c in string.ascii_lowercase: 
     for s in iterate_strings(n - 1): 
      yield c + s 
+0

mặc dù nó đi ngược lại, tuyệt vời! – calccrypto

+0

Đã khắc phục sự cố về sau. Bình chọn cho câu trả lời của tôi xin vui lòng :) – Adam

+0

tôi đã cố gắng, nhưng dường như tôi cần 15 danh tiếng – calccrypto

0

Bạn có thể nhân chuỗi trong số nguyên. Ví dụ:

>>> 'a' * 2 
'aa' 
>>> 'a' * 4 
'aaaa' 
>>> 'z' * 3 
'zzz' 
>>> 'az' * 3 
'azazaz' 
+0

có, nhưng tôi muốn chạy qua tất cả các hoán vị – calccrypto

+0

Hãy xem liệu tôi có đúng không: Bạn muốn lặp qua tất cả các chuỗi giữa 'aaaa' và 'zzzz', ('aaaa', 'aaab', 'aaac' , .... 'zzzz'). – Adam

+0

chính xác. cho đến khi chuỗi ký tự x dài – calccrypto

0

Xác định x. Tôi đang sử dụng x = 5 cho ví dụ này.

x = 5 
import string 
for n in range(1,x+1): 
    for letter in string.ascii_lowercase: 
    print letter*n 
+0

Bạn có thể muốn đặt giá trị bắt đầu của câu lệnh phạm vi vì điều đầu tiên được in bằng mã đó là 26 dòng trống vì bạn đang thực hiện 'ký tự * 0' lúc đầu. – Dustin

+0

Rất đúng. Đã sửa. – tdedecko

2

Đây là giải pháp của tôi, tương tự như của Adam, ngoại trừ nó không đệ quy. :].

from itertools import product 
from string import lowercase 

def letter_generator(limit): 
    for length in range(1, limit+1): 
     for letters in product(lowercase, repeat=length): 
      yield ''.join(letters) 

Và nó trả về một generator, vì vậy bạn có thể sử dụng một vòng lặp for để lặp qua nó:

for letters in letter_generator(5): 
    # ... 

Hãy vui vẻ!

(Đây là lần thứ hai hôm nay tôi tìm thấy itertools.product() hữu ích. Woot.)

Các vấn đề liên quan