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