Найти - Пользователи
Полная версия: Выбрать все элементы с одинаковым ключом из словаря
Начало » Python для новичков » Выбрать все элементы с одинаковым ключом из словаря
1
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}
        }
    }

В итоге получив словарь такого вида

 {
    "tires":{
            'stock1': {1000, 47},
            'stock2': {1000, 47}
        },
    "pump":{
            'stock1': {200, 23},
            'stock3': {200, 23}
        },
    "battery":{
            'stock2': {805, 55},
            'stock3': {800, 37}
        }
}

FishHook
Блин, камрад, тебя самого формулировка твоего вопроса не смущает? Что значит “как выбрать”? Ну, бля.., ну взять да и выбрать, пройтись циклом по элементам коллекции и составить другую коллекцию, помещая элементы в соответствующие места. Но тебе же наверняка не такой ответ нужен, тебе я так понимаю решение нужно. Ну так и скажи - друзья, решите за меня задачу, такие-то условия.
izooomrud
FishHook
Блин, камрад, тебя самого формулировка твоего вопроса не смущает? Что значит “как выбрать”? Ну, бля.., ну взять да и выбрать, пройтись циклом по элементам коллекции и составить другую коллекцию, помещая элементы в соответствующие места. Но тебе же наверняка не такой ответ нужен, тебе я так понимаю решение нужно. Ну так и скажи - друзья, решите за меня задачу, такие-то условия.
Я не представляю даже как это сделать, можешь хоть часть решения показать, не “делая работу” за меня, но тебе я так понимаю не это нужно. Ну так и скажи - я пришёл сюда побрызгать желчью и потешить своё эго, я самый крутой прогер, а ты нуб и говно, решай свои проблемы сам
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)
  
izooomrud
FishHook
Ну и нафиг ты тогда этим занимаешься?
Ну знаешь, кто-то пиво в подъезде бухает, а кто-то что-то изучает, у каждого свои увлечения

Я не мог понять как при проходе цикла взять ключ и искать его вхождение по сути в другом каталоге и если он найден/не найден выполнить нужное действие, а затем вернуться опять в первый и взять уже следующий элемент.
py.user.next
izooomrud
Как можно выбрать одинаковые элементы словаря?
izooomrud
В итоге получив словарь такого вида
И где в получившемся словаре tools?

Тут добавил object, он не повторяется
  
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}
    }
}
object идёт в результат?
izooomrud
py.user.next
И где в получившемся словаре tools?
Это я провтыкал просто из-за невнимательности пропустил, так торопился задать вопрос
py.user.next
object идёт в результат?
нет кстати не должен идти, но идёт
izooomrud
py.user.next
object идёт в результат?

похоже, что удалось допилить, благодаря началу от FishHook

 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)
py.user.next
Тут я разложил всё в более плоские структуры
  
>>> 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.

Вот это надо соблюдать. Когда у тебя возникнет похожая задача и надо будет немножко по-другому всё выбирать из немножко по-другому устроенной структуры данных, плоские и растянутые структуры кода будут пригодны для переиспользования кода. То есть ты сможешь их взять целиком или же взять их куски. Главное, что ты быстро сможешь собрать новый код из уже готовых участков.

1. Здесь я сначала преобразовал исходную структуру данных в более удобную форму.
2. Затем я создал вспомогательную структуру данных для фильтрации.
3. Затем я выполнил фильтрацию элементов и получил отфильтрованную структуру данных в удобной форме.
4. И после этого я составил конечную структуру данных уже в той форме, которая нужна в результате.

Так вот может появиться задача, в которой один из этих четырёх пунктов другой. Достаточно будет его заменить, а всё остальное взять в готовом виде.

Также в таких плоских кодах легко обнаруживать баги, когда они там есть. Если же код плотный, то он типа так умно выглядит, но там легко прячутся баги, если они там есть.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB