はcombs_r
がaccum
は(次のリストをhead
ダイジェスト持つ再帰を使用したソリューションであり、ラインで)、次いで、太っaccum0
生成するとtail
(残りのリスト)と今太っACCUMと)「再帰」(自分自身を呼び出すaccum0
。 combs_r
への各呼び出しは、それがすべて巻き戻しが終了するまで、新しい名前空間を追加するよう
は、メモリのヘビーユーザーである可能性があります。 Python内部でもっと知っている人がこれについてコメントしているかもしれません。
はプロローグ、私見を学ぶために支払います。不思議に思っています誰のため
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)
、目の前にある*は、リストをアンパック:私は常に唯一の例のように、2つのサブリストを持っていた場合に働くだろうhttp://stackoverflow.com/a/2921893/4549682 – wordsforthewise