Тут я разложил всё в более плоские структуры
>>> import pprint
>>>
>>> data = {
... 'stock1': {
... 'tools': {100, 5},
... 'tires': {1000, 47},
... 'pump': {200, 23}
... },
... 'stock2': {
... 'screws': {101, 5},
... 'tires': {1000, 47},
... 'battery': {805, 55}
... },
... 'stock3': {
... 'tools': {100, 5},
... 'battery': {800, 37},
... 'pump': {200, 23}
... }
... }
>>>
>>> rebuilt = []
>>> for stock in data:
... for iname, ivalue in data[stock].items():
... rebuilt.append((iname, stock, ivalue))
...
>>> # pprint.pprint(rebuilt)
...
>>> counter = {}
>>> for iname, _, _ in rebuilt:
... counter[iname] = counter.get(iname, 0) + 1
...
>>> # pprint.pprint(counter)
...
>>> filtered = {iname for iname, number in counter.items() if number > 1}
>>>
>>> # pprint.pprint(filtered)
...
>>> out = {}
>>> for iname, stock, ivalue in rebuilt:
... if iname in filtered:
... if iname in out:
... out[iname][stock] = ivalue
... else:
... out[iname] = {stock: ivalue}
...
>>> pprint.pprint(out)
{'battery': {'stock2': {805, 55}, 'stock3': {800, 37}},
'pump': {'stock1': {200, 23}, 'stock3': {200, 23}},
'tires': {'stock1': {1000, 47}, 'stock2': {1000, 47}},
'tools': {'stock1': {100, 5}, 'stock3': {100, 5}}}
>>>
Если выполнишь
там есть есть строки
Flat is better than nested.
Sparse is better than dense.
Вот это надо соблюдать. Когда у тебя возникнет похожая задача и надо будет немножко по-другому всё выбирать из немножко по-другому устроенной структуры данных, плоские и растянутые структуры кода будут пригодны для переиспользования кода. То есть ты сможешь их взять целиком или же взять их куски. Главное, что ты быстро сможешь собрать новый код из уже готовых участков.
1. Здесь я сначала преобразовал исходную структуру данных в более удобную форму.
2. Затем я создал вспомогательную структуру данных для фильтрации.
3. Затем я выполнил фильтрацию элементов и получил отфильтрованную структуру данных в удобной форме.
4. И после этого я составил конечную структуру данных уже в той форме, которая нужна в результате.
Так вот может появиться задача, в которой один из этих четырёх пунктов другой. Достаточно будет его заменить, а всё остальное взять в готовом виде.
Также в таких плоских кодах легко обнаруживать баги, когда они там есть. Если же код плотный, то он типа так умно выглядит, но там легко прячутся баги, если они там есть.