Обобщая @a_guest, у меня было:
data = [
('U', 10, 'checksum1', 'filename1'),
('U', 10, 'checksum2', 'filename2'),
('U', 20, 'checksum3', 'filename3'),
('V', 20, 'checksum4', 'filename4'),
('V', 20, 'checksum5', 'filename5'),
]
data = [dict(zip(('A','B','C','D'), (x))) for x in data]
# [{'A': 'U', 'B': 10, 'C': 'checksum1', 'D': 'filename1'},
# {'A': 'U', 'B': 10, 'C': 'checksum2', 'D': 'filename2'},
# {'A': 'U', 'B': 20, 'C': 'checksum3', 'D': 'filename3'},
# {'A': 'V', 'B': 20, 'C': 'checksum4', 'D': 'filename4'},
# {'A': 'V', 'B': 20, 'C': 'checksum5', 'D': 'filename5'}]
Затем "группировка по" A и B:
keys=["A","B"]
result = [ list(g) for k,g in it.groupby(data, lambda x: (tuple(x[k] for k in keys)) ) ]
# [[{'A': 'U', 'B': 10, 'C': 'checksum1', 'D': 'filename1'},
# {'A': 'U', 'B': 10, 'C': 'checksum2', 'D': 'filename2'}],
# [{'A': 'U', 'B': 20, 'C': 'checksum3', 'D': 'filename3'}],
# [{'A': 'V', 'B': 20, 'C': 'checksum4', 'D': 'filename4'},
# {'A': 'V', 'B': 20, 'C': 'checksum5', 'D': 'filename5'}]]
и "извлечение" C и D для этих групп :
names=["C","D"]
res2 = [ [ tuple(x[n] for n in names) for x in r] for r in result ]
# [[('checksum1', 'filename1'), ('checksum2', 'filename2')],
# [('checksum3', 'filename3')],
# [('checksum4', 'filename4'), ('checksum5', 'filename5')]]
Таким образом, представление может быть:
values = [ tuple(d.get(k) for k in keys) for d in data ]
res3 = dict(zip(set(values),res2))
# {('U', 10): [('checksum1', 'filename1'), ('checksum2', 'filename2')],
# ('U', 20): [('checksum3', 'filename3')],
# ('V', 20): [('checksum4', 'filename4'), ('checksum5', 'filename5')]}
Я не знаю, можно ли упростить мои списки понимания или избежать импорта itertool
. Я новичок в этом.