#!/usr/bin/env python
# -*- coding: utf-8 -*-
my_list = [(0,1),(1,0),(2,1),(3,0),(4,1),(5,3),(6,3)]
# remove the comment to sort the list by id if you need
#my_list.sort()
def select(my_list, k):
# used to check the sum of two value equals to k
chk = {}
# used to store the candidates which pass the check with the data structure (item_1, item_2)
tmp = []
for item in my_list:
if k - item[1] in chk and chk[k - item[1]]:
tmp.append((chk[k - item[1]].pop(), item))
else:
if item[1] in chk:
chk[item[1]].append(item)
else:
chk[item[1]] = [item]
reminder = [item for value in chk.values() for item in value]
return tmp, reminder
B, my_list = select(my_list, 2)
C, D = select(my_list, 1)
print "B =", B
print "C =", C
print "D =", D
IyEvdXNyL2Jpbi9lbnYgcHl0aG9uCiMgLSotIGNvZGluZzogdXRmLTggLSotCgpteV9saXN0ID0gWygwLDEpLCgxLDApLCgyLDEpLCgzLDApLCg0LDEpLCg1LDMpLCg2LDMpXQoKIyByZW1vdmUgdGhlIGNvbW1lbnQgdG8gc29ydCB0aGUgbGlzdCBieSBpZCBpZiB5b3UgbmVlZAojbXlfbGlzdC5zb3J0KCkKCmRlZiBzZWxlY3QobXlfbGlzdCwgayk6CgogICAgIyB1c2VkIHRvIGNoZWNrIHRoZSBzdW0gb2YgdHdvIHZhbHVlIGVxdWFscyB0byBrCiAgICBjaGsgPSB7fQoKICAgICMgdXNlZCB0byBzdG9yZSB0aGUgY2FuZGlkYXRlcyB3aGljaCBwYXNzIHRoZSBjaGVjayB3aXRoIHRoZSBkYXRhIHN0cnVjdHVyZSAoaXRlbV8xLCBpdGVtXzIpCiAgICB0bXAgPSBbXQogICAgZm9yIGl0ZW0gaW4gbXlfbGlzdDoKCiAgICAgICAgaWYgayAtIGl0ZW1bMV0gaW4gY2hrIGFuZCBjaGtbayAtIGl0ZW1bMV1dOgogICAgICAgICAgICB0bXAuYXBwZW5kKChjaGtbayAtIGl0ZW1bMV1dLnBvcCgpLCBpdGVtKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBpdGVtWzFdIGluIGNoazoKICAgICAgICAgICAgICAgIGNoa1tpdGVtWzFdXS5hcHBlbmQoaXRlbSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGNoa1tpdGVtWzFdXSA9IFtpdGVtXQoKICAgIHJlbWluZGVyID0gW2l0ZW0gZm9yIHZhbHVlIGluIGNoay52YWx1ZXMoKSBmb3IgaXRlbSBpbiB2YWx1ZV0KICAgIHJldHVybiB0bXAsIHJlbWluZGVyCgpCLCBteV9saXN0ID0gc2VsZWN0KG15X2xpc3QsIDIpCkMsIEQgPSBzZWxlY3QobXlfbGlzdCwgMSkKCnByaW50ICJCID0iLCBCCnByaW50ICJDID0iLCBDCnByaW50ICJEID0iLCBE
B = [((0, 1), (2, 1))]
C = [((3, 0), (4, 1))]
D = [(1, 0), (5, 3), (6, 3)]