Đây là một giải pháp sử dụng đệ quy, combs_r
có accum
tiêu hóa head
(danh sách tiếp theo phù hợp) để tạo ra một fatter accum0
, sau đó và tự gọi ("đệ quy") với tail
(các danh sách còn lại) và số dư hiện đang tích lũy accum0
.
Có thể là người dùng nhiều bộ nhớ khi mỗi cuộc gọi đến combs_r
thêm một không gian tên mới, cho đến khi kết thúc khi tất cả thư giãn. Người biết nhiều hơn trong nội bộ Python có thể bình luận về điều này.
Trả tiền để học prolog, IMHO.
def combs(ll):
if len(ll) == 0:
return []
if len(ll) == 1:
return [[item] for item in ll[0]]
elif len(ll) == 2:
return lmul(ll[0], [[item] for item in ll[1]])
else:
return combs_r(ll[1:], ll[0])
def combs_r(ll, accum):
head = ll[0]
tail = ll[1:]
accum0 = []
accum0 = lmul(head, accum)
if len(tail) == 0:
return accum0
else:
return combs_r(tail, accum0)
def lmul(head, accum):
accum0 = []
for ah in head:
for cc in accum:
#cc will be reused for each ah, so make a clone to mutate
cc0 = [x for x in cc]
cc0.append(ah)
accum0.append(cc0)
return accum0
sampleip = [['a','b','c'],[1,2], ['A', 'B']]
sampleip2 = [['a','b','c'],[1,2]]
sampleip1 = [['a','b','c']]
sampleip0 = []
print combs(sampleip0)
print combs(sampleip1)
print combs(sampleip2)
print combs(sampleip)
Nguồn
2011-11-24 01:38:50
Đối với những ai đang tự hỏi, các * ở phía trước của một giải nén danh sách: http://stackoverflow.com/a/2921893/4549682 – wordsforthewise