Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 16, 2021 12:48:37

izooomrud
Зарегистрирован: 2021-01-16
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Выбрать все элементы с одинаковым ключом из словаря

Привет.
Как можно выбрать одинаковые элементы словаря?

 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)

Офлайн

#2 Янв. 16, 2021 14:04:47

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Выбрать все элементы с одинаковым ключом из словаря

Блин, камрад, тебя самого формулировка твоего вопроса не смущает? Что значит “как выбрать”? Ну, бля.., ну взять да и выбрать, пройтись циклом по элементам коллекции и составить другую коллекцию, помещая элементы в соответствующие места. Но тебе же наверняка не такой ответ нужен, тебе я так понимаю решение нужно. Ну так и скажи - друзья, решите за меня задачу, такие-то условия.



Офлайн

#3 Янв. 16, 2021 14:15:21

izooomrud
Зарегистрирован: 2021-01-16
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Выбрать все элементы с одинаковым ключом из словаря

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

Офлайн

#4 Янв. 16, 2021 14:24:19

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Выбрать все элементы с одинаковым ключом из словаря

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)
  



Офлайн

#5 Янв. 16, 2021 14:49:28

izooomrud
Зарегистрирован: 2021-01-16
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Выбрать все элементы с одинаковым ключом из словаря

FishHook
Ну и нафиг ты тогда этим занимаешься?
Ну знаешь, кто-то пиво в подъезде бухает, а кто-то что-то изучает, у каждого свои увлечения

Я не мог понять как при проходе цикла взять ключ и искать его вхождение по сути в другом каталоге и если он найден/не найден выполнить нужное действие, а затем вернуться опять в первый и взять уже следующий элемент.

Офлайн

#6 Янв. 16, 2021 15:32:46

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

Выбрать все элементы с одинаковым ключом из словаря

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 идёт в результат?



Отредактировано py.user.next (Янв. 16, 2021 15:36:17)

Офлайн

#7 Янв. 16, 2021 16:05:00

izooomrud
Зарегистрирован: 2021-01-16
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Выбрать все элементы с одинаковым ключом из словаря

py.user.next
И где в получившемся словаре tools?
Это я провтыкал просто из-за невнимательности пропустил, так торопился задать вопрос
py.user.next
object идёт в результат?
нет кстати не должен идти, но идёт

Отредактировано izooomrud (Янв. 16, 2021 16:21:40)

Офлайн

#8 Янв. 16, 2021 17:58:47

izooomrud
Зарегистрирован: 2021-01-16
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Выбрать все элементы с одинаковым ключом из словаря

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)

Офлайн

#9 Янв. 17, 2021 02:37:40

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

Выбрать все элементы с одинаковым ключом из словаря

Тут я разложил всё в более плоские структуры

  
>>> 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. И после этого я составил конечную структуру данных уже в той форме, которая нужна в результате.

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

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



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version