I have a set of different lists of dictionaries (actually obtained reading Excel worksheets) and I need to do an "inner join" on them:
- each list is equivalent to a database table (each dict is a record)
- each record has a specific key guaranteed unique in the list (column is "index")
- I need to produce another list of dictionaries where each dictionary has a given "index" and all other key/value found in all lists where "index" match
To exemplify:
a = [{'idx': 1, 'foo': 'xx1', 'bar': 'yy1'},
{'idx': 0, 'foo': 'xx0', 'bar': 'yy0'},
{'idx': 2, 'foo': 'xx2', 'bar': 'yy2'}]
b = [{'idx': 0, 'fie': 'zz0', 'fom': 'kk0'},
{'idx': 3, 'fie': 'zz3', 'fom': 'kk3'},
{'idx': 1, 'fie': 'zz1', 'fom': 'kk1'}]
and I want yo have:
c = [{'idx': 0, 'foo': 'xx0', 'bar': 'yy0', 'fie': 'zz0', 'fom': 'kk0'},
{'idx': 1, 'foo': 'xx1', 'bar': 'yy1', 'fie': 'zz1', 'fom': 'kk1'},
{'idx': 2, 'foo': 'xx2', 'bar': 'yy2'},
{'idx': 3, 'fie': 'zz3', 'fom': 'kk3'}]
of course problem is various list may have different length and not be sorted nicely.
Is there an easy way to do this or should I do nested loops explicitly searching for the matching record?
This actually works, but I'm VERY unsure it's the "most pythonic way":
a = [{'idx': 0, 'foo': 'xx0', 'bar': 'yy0'},
{'idx': 1, 'foo': 'xx1', 'bar': 'yy1'},
{'idx': 2, 'foo': 'xx2', 'bar': 'yy2'}]
b = [{'idx': 0, 'fie': 'zz0', 'fom': 'kk0'},
{'idx': 1, 'fie': 'zz1', 'fom': 'kk1'},
{'idx': 3, 'fie': 'zz3', 'fom': 'kk3'}]
c = [{'idx': 0, 'foo': 'xx0', 'bar': 'yy0', 'fie': 'zz0', 'fom': 'kk0'},
{'idx': 1, 'foo': 'xx1', 'bar': 'yy1', 'fie': 'zz1', 'fom': 'kk1'},
{'idx': 2, 'foo': 'xx2', 'bar': 'yy2'},
{'idx': 3, 'fie': 'zz3', 'fom': 'kk3'}]
li = [a, b]
t = [{z['idx']: z for z in w} for w in li]
r = {}
for k in t:
for j in k:
if j in r:
r[j].update(k[j])
else:
r[j] = k[j]
r = [t for t in r.values()]
print(r)
[{'idx': 0, 'foo': 'xx0', 'bar': 'yy0', 'fie': 'zz0', 'fom': 'kk0'}, {'idx': 1, 'foo': 'xx1', 'bar': 'yy1', 'fie': 'zz1', 'fom': 'kk1'}, {'idx': 2, 'foo': 'xx2', 'bar': 'yy2'}, {'idx': 3, 'fie': 'zz3', 'fom': 'kk3'}]
Can someone come up with something better?