def choose(n, k):
if k == 0:
yield ()
return
if n < k:
return
for r in choose(n-1,k-1):
yield (True,) + r
for r in choose(n-1,k):
yield (False,) + r
def compress(seq1, seq2):
''' yeild seq1 values where seq2 is true '''
i1, i2 = iter(seq1), iter(seq2)
while i1 and i2:
val = i1.next()
if i2.next():
yield val
def combinations(seq, k):
for choice in choose(len(seq), k):
yield tuple(compress(seq, choice))
sequence = (50,60,70,80,90)
k = 3
for combination in combinations(sequence,k):
print combination
ZGVmIGNob29zZShuLCBrKToKICAgIGlmIGsgPT0gMDoKICAgICAgICB5aWVsZCAoKQogICAgICAgIHJldHVybgogICAgaWYgbiA8IGs6CiAgICAgICAgcmV0dXJuCiAgICBmb3IgciBpbiBjaG9vc2Uobi0xLGstMSk6CiAgICAgICAgeWllbGQgKFRydWUsKSArIHIKICAgIGZvciByIGluIGNob29zZShuLTEsayk6CiAgICAgICAgeWllbGQgKEZhbHNlLCkgKyByCgpkZWYgY29tcHJlc3Moc2VxMSwgc2VxMik6CiAgICAnJycgeWVpbGQgc2VxMSB2YWx1ZXMgd2hlcmUgc2VxMiBpcyB0cnVlICcnJwogICAgaTEsIGkyID0gaXRlcihzZXExKSwgaXRlcihzZXEyKQogICAgd2hpbGUgaTEgYW5kIGkyOgogICAgICAgIHZhbCA9IGkxLm5leHQoKQogICAgICAgIGlmIGkyLm5leHQoKToKICAgICAgICAgICAgeWllbGQgdmFsCgpkZWYgY29tYmluYXRpb25zKHNlcSwgayk6CiAgICBmb3IgY2hvaWNlIGluIGNob29zZShsZW4oc2VxKSwgayk6CiAgICAgICAgeWllbGQgdHVwbGUoY29tcHJlc3Moc2VxLCBjaG9pY2UpKQoKc2VxdWVuY2UgPSAoNTAsNjAsNzAsODAsOTApCmsgPSAzCmZvciBjb21iaW5hdGlvbiBpbiBjb21iaW5hdGlvbnMoc2VxdWVuY2Usayk6CiAgICBwcmludCBjb21iaW5hdGlvbgo=
(50, 60, 70)
(50, 60, 80)
(50, 60, 90)
(50, 70, 80)
(50, 70, 90)
(50, 80, 90)
(60, 70, 80)
(60, 70, 90)
(60, 80, 90)
(70, 80, 90)