Форум сайта python.su
Привет.
Как можно выбрать одинаковые элементы словаря?
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} } }
{ "tires":{ 'stock1': {1000, 47}, 'stock2': {1000, 47} }, "pump":{ 'stock1': {200, 23}, 'stock3': {200, 23} }, "battery":{ 'stock2': {805, 55}, 'stock3': {800, 37} } }
Отредактировано izooomrud (Янв. 16, 2021 12:50:11)
Офлайн
Блин, камрад, тебя самого формулировка твоего вопроса не смущает? Что значит “как выбрать”? Ну, бля.., ну взять да и выбрать, пройтись циклом по элементам коллекции и составить другую коллекцию, помещая элементы в соответствующие места. Но тебе же наверняка не такой ответ нужен, тебе я так понимаю решение нужно. Ну так и скажи - друзья, решите за меня задачу, такие-то условия.
Офлайн
FishHookЯ не представляю даже как это сделать, можешь хоть часть решения показать, не “делая работу” за меня, но тебе я так понимаю не это нужно. Ну так и скажи - я пришёл сюда побрызгать желчью и потешить своё эго, я самый крутой прогер, а ты нуб и говно, решай свои проблемы сам
Блин, камрад, тебя самого формулировка твоего вопроса не смущает? Что значит “как выбрать”? Ну, бля.., ну взять да и выбрать, пройтись циклом по элементам коллекции и составить другую коллекцию, помещая элементы в соответствующие места. Но тебе же наверняка не такой ответ нужен, тебе я так понимаю решение нужно. Ну так и скажи - друзья, решите за меня задачу, такие-то условия.
Офлайн
izooomrudНу и нафиг ты тогда этим занимаешься?
Я не представляю даже как это сделать
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} } } res = {} for stock, items_dict in data.items(): for item, value in items_dict.items(): res.setdefault(item, {}) res[item][stock] = value print(res)
Офлайн
FishHookНу знаешь, кто-то пиво в подъезде бухает, а кто-то что-то изучает, у каждого свои увлечения
Ну и нафиг ты тогда этим занимаешься?
Офлайн
izooomrud
Как можно выбрать одинаковые элементы словаря?
izooomrudИ где в получившемся словаре tools?
В итоге получив словарь такого вида
data = { "stock1": { 'object': {10, 2}, '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} } }
Отредактировано py.user.next (Янв. 16, 2021 15:36:17)
Офлайн
py.user.nextЭто я провтыкал просто из-за невнимательности пропустил, так торопился задать вопрос
И где в получившемся словаре tools?
py.user.nextнет кстати не должен идти, но идёт
object идёт в результат?
Отредактировано izooomrud (Янв. 16, 2021 16:21:40)
Офлайн
py.user.next
object идёт в результат?
res = {} buffer = {} for stock, items_dict in data.items(): for item, value in items_dict.items(): if item in res: res.setdefault(item, {}) res[item][stock] = value print(item + ' добавлен в общий словарь т.к в нем обнаружено совпадение') elif item in buffer: res.setdefault(item, {}) res[item] = buffer[item] res[item][stock] = value print(item + ' добавлен в общий словарь т.к в буфере для него есть совпадение') else: buffer.setdefault(item, {}) buffer[item][stock] = value print(item + ' добавлен в буфер и ожидает совпадения') print(res)
Офлайн
Тут я разложил всё в более плоские структуры
>>> 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}}} >>>
import this
Flat is better than nested.
Sparse is better than dense.
Офлайн