2011-08-20 18 views
5

Tôi đang cố gắng để tạo ra một vòng lặp để tạo ra và chuỗi in như sau:Tạo chuỗi chữ và số tuần tự

  1. chữ và số ký tự:
  2. 0-9 là trước AZ, ngay trước az,
  3. Độ dài tối đa 4 ký tự.

Vì vậy, nó sẽ in:

  1. tất cả các chuỗi từ 0-z
  2. sau đó từ 00-zz
  3. sau đó từ 000-zzz
  4. sau đó từ 0000-zzzz

thì dừng lại.

+0

Thật khó hiểu câu hỏi của bạn ... liệu a07z có phải là chuỗi hợp pháp hay không? – immortal

+0

Có. Tất cả các chuỗi chữ số và độ dài 1-4 là hợp pháp – joseph

+0

Vì vậy, khi bạn nói 0-9 là trước A-Z, nghĩa là 0000 phải đến trước A000? – immortal

Trả lời

17
from string import digits, ascii_uppercase, ascii_lowercase 
from itertools import product 

chars = digits + ascii_uppercase + ascii_lowercase 

for n in range(1, 4 + 1): 
    for comb in product(chars, repeat=n): 
     print ''.join(comb) 

Điều này đầu tiên tạo chuỗi gồm tất cả các chữ số, chữ hoa và chữ thường.

Sau đó, đối với mỗi độ dài từ 1-4, nó sẽ in mọi kết hợp có thể có của các số và chữ cái đó.

ghi nhớ này là rất nhiều kết hợp - 62^4 + 62^3 + 62^2 + 62.

+0

Đó là một giải pháp tuyệt vời. Ngoài ra một điều thú vị để làm là để làm cho nó một máy phát điện thay vì trực tiếp in các chuỗi. – Drekembe

+0

Tôi biết đó là một tấn kết hợp, tôi chủ yếu làm việc đó chỉ nhằm mục đích thử nghiệm. Tôi cắt nó xuống 3 ký tự thay vì 4 – joseph

+0

Vâng, anh ấy nói rằng anh ấy muốn có một "vòng lặp in chuỗi" vì vậy đó là những gì tôi đã cho anh ta. – agf

0

Tôi không thích câu trả lời đưa ra trước khi tôi sử dụng product kể từ khi nhìn vào thực hiện nó trong python tài liệu có vẻ như kéo dài toàn bộ điều vào một danh sách trong bộ nhớ trước khi bắt đầu mang lại kết quả.

Điều này là rất xấu cho trường hợp của bạn kể từ khi, như agf mình nói, số hoán vị ở đây là rất lớn (hơn một triệu). Đối với trường hợp này, câu lệnh yield được tạo - để các danh sách lớn có thể được tạo động chứ không phải được mở rộng trong bộ nhớ (tôi cũng không thích lãng phí range trong đó xrange là hoàn toàn có thể áp dụng).

tôi muốn đi cho một giải pháp như thế này:

def generate(chars, length, prefix = None): 
    if length < 1: 
     return 
    if not prefix: 
     prefix = '' 
    for char in chars: 
     permutation = prefix + char 
     if length == 1: 
      yield permutation 
     else: 
      for sub_permutation in generate(chars, length - 1, prefix = permutation): 
       yield sub_permutation 

Bằng cách này, tất cả những gì trải dài trong bộ nhớ là một chồng đệ quy "n" sâu, trong đó "n" là chiều dài của hoán vị của bạn (4 trong trường hợp này) và chỉ một phần tử được trả về mỗi lần.

ký tự là bộ ký tự để chọn, độ dài là 4 và việc sử dụng khá giống với sản phẩm, ngoại trừ việc nó không kéo dài toàn bộ danh sách trong bộ nhớ trong thời gian chạy.

+2

Nó nói trong mô tả 'product' -" Chức năng này tương đương với đoạn mã sau, ngoại trừ việc thực thi thực tế không xây dựng kết quả trung gian trong bộ nhớ: "Tất cả các công cụ trong' itertools' hoạt động theo cách đó, đó là toàn bộ mục đích của mô-đun. – agf

+0

cũng, phạm vi gọi (5) lãng phí so với xrange là một chút của một ... – hop

+0

Tôi nghĩ rằng đối với phạm vi rất nhỏ, 'phạm vi' thực sự là _less_ lãng phí hơn' xrange'. – agf

0

Tôi đã mã hóa điều này ngay hôm nay. Nó thực hiện chính xác những gì bạn muốn và nhiều hơn nữa. Nó cũng có thể mở rộng là

def lastCase (lst): 
    for i in range(0, len(lst)): 
     if (lst[i] != '_'): 
      return False 
    return True 


l = [''] * 4 #change size here if needed. I used 4 
l[0] = '0' 
index = 0 

while (not lastCase(l)): 

    if (ord(l[index]) > ord('_')): 
     l[index] = '0' 
     index += 1 
     while(l[index] == '_'): 
      l[index] = '0' 
      index += 1 
     if (l[index] == ''): 
      l[index] = '0' 

    #print or process generated string 
    print(''.join(l)) 

    l[index] = chr(ord(l[index]) +1) 

    if (ord(l[index]) > ord('9') and ord(l[index]) < ord('A')): 
     l[index] = 'A' 
    elif (ord(l[index]) > ord('Z') and ord(l[index]) < ord('_') ): 
     l[index] = '_' 

    index = 0 

print (''.join(l)) 
Các vấn đề liên quan