from collections import defaultdict
def find_pair_by_sum(list_id_value, _sum):
idx_for_value = defaultdict(list)
paired = []
for idx, value in list_id_value:
try:
# find the index of corresponding (_sum - value)
value2 = _sum - value
idx2 = idx_for_value[value2].pop()
paired.append(((idx2, value2), (idx, value)))
except IndexError:
# cannot find a matched pair
idx_for_value[value].append(idx)
rest = [(idx, value) for value in idx_for_value for idx in idx_for_value[value]]
return paired, rest
L = [(0,1), (1,2), (2,1), (3,1), (4,0), (5,0), (6,3)]
B, rest = find_pair_by_sum(L, 2)
C, D = find_pair_by_sum(rest, 1)
print('list = ', L)
print('B = ', B)
print('C = ', C)
print('D = ', D)
ZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVmYXVsdGRpY3QKCmRlZiBmaW5kX3BhaXJfYnlfc3VtKGxpc3RfaWRfdmFsdWUsIF9zdW0pOgogICAgaWR4X2Zvcl92YWx1ZSA9IGRlZmF1bHRkaWN0KGxpc3QpCiAgICBwYWlyZWQgPSBbXQogICAgZm9yIGlkeCwgdmFsdWUgaW4gbGlzdF9pZF92YWx1ZToKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgZmluZCB0aGUgaW5kZXggb2YgY29ycmVzcG9uZGluZyAoX3N1bSAtIHZhbHVlKQogICAgICAgICAgICB2YWx1ZTIgPSBfc3VtIC0gdmFsdWUKICAgICAgICAgICAgaWR4MiA9IGlkeF9mb3JfdmFsdWVbdmFsdWUyXS5wb3AoKQogICAgICAgICAgICBwYWlyZWQuYXBwZW5kKCgoaWR4MiwgdmFsdWUyKSwgKGlkeCwgdmFsdWUpKSkKICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKICAgICAgICAgICAgIyBjYW5ub3QgZmluZCBhIG1hdGNoZWQgcGFpcgogICAgICAgICAgICBpZHhfZm9yX3ZhbHVlW3ZhbHVlXS5hcHBlbmQoaWR4KQogICAgcmVzdCA9IFsoaWR4LCB2YWx1ZSkgZm9yIHZhbHVlIGluIGlkeF9mb3JfdmFsdWUgZm9yIGlkeCBpbiBpZHhfZm9yX3ZhbHVlW3ZhbHVlXV0KICAgIHJldHVybiBwYWlyZWQsIHJlc3QKCkwgPSBbKDAsMSksICgxLDIpLCAoMiwxKSwgKDMsMSksICg0LDApLCAoNSwwKSwgKDYsMyldCgpCLCByZXN0ID0gZmluZF9wYWlyX2J5X3N1bShMLCAyKQpDLCBEID0gZmluZF9wYWlyX2J5X3N1bShyZXN0LCAxKQoKcHJpbnQoJ2xpc3QgPSAnLCBMKQpwcmludCgnQiA9ICcsIEIpCnByaW50KCdDID0gJywgQykKcHJpbnQoJ0QgPSAnLCBEKQ==
list = [(0, 1), (1, 2), (2, 1), (3, 1), (4, 0), (5, 0), (6, 3)]
B = [((0, 1), (2, 1)), ((1, 2), (4, 0))]
C = [((5, 0), (3, 1))]
D = [(6, 3)]