Как создать вложенные словари из большого словаря в Python?

#python #python-3.x #numpy #numpy-ndarray

#python #python-3.x #numpy #numpy-ndarray

Вопрос:

У меня есть словарь Python, как показано ниже. В котором вы можете видеть, что некоторые values из них являются нулями для данного key . Я хочу создавать вложенные словари из основного словаря всякий раз, когда он содержит ненулевые значения.

 74: (0, 0, 0, 0, 0),
 75: (0, 0, 0, 0, 0),
 76: (0, 0, 0, 0, 0),
 77: (69, 76, 151, 157, 42),
 78: (68, 78, 150, 160, 100),
 79: (69, 77, 151, 159, 64),
 80: (69, 77, 151, 159, 64),
 81: (71, 74, 154, 158, 12),
 82: (0, 0, 0, 0, 0),
 83: (0, 0, 0, 0, 0),
 84: (0, 0, 0, 0, 0),
 85: (0, 0, 0, 0, 0),
 86: (0, 0, 0, 0, 0),
 87: (0, 0, 0, 0, 0),
 88: (0, 0, 0, 0, 0),
 89: (0, 0, 0, 0, 0),
 90: (0, 0, 0, 0, 0),
 91: (0, 0, 0, 0, 0),
 92: (0, 0, 0, 0, 0),
 93: (0, 0, 0, 0, 0),
 94: (0, 0, 0, 0, 0),
 95: (64, 68, 150, 153, 12),
 96: (63, 79, 148, 159, 176),
 97: (64, 79, 148, 159, 165),
 98: (63, 81, 146, 175, 522),
 99: (63, 82, 145, 179, 646),
 

Например, в приведенном выше случае я должен иметь возможность создать два вложенных словаря (из 77-81 и 95-99). Как я могу добиться этого в Python?

Комментарии:

1. Почему теги numpy?

Ответ №1:

Используйте понимание dict с условием:

 output = {key: value for key, value in orig_dict.items() if all(value)}
 

Если вы хотите быть более явным:

 output = {key: value for key, value in orig_dict.items() if all(n != 0 for n in value)}
 

В обоих случаях output является

 {77: (69, 76, 151, 157, 42),
 78: (68, 78, 150, 160, 100),
 79: (69, 77, 151, 159, 64),
 80: (69, 77, 151, 159, 64),
 81: (71, 74, 154, 158, 12),
 95: (64, 68, 150, 153, 12),
 96: (63, 79, 148, 159, 176),
 97: (64, 79, 148, 159, 165),
 98: (63, 81, 146, 175, 522),
 99: (63, 82, 145, 179, 646)}
 

Приведенный выше пример добавит запись в новый словарь тогда и только тогда, когда все числа в кортеже отличны от нуля. Если вы хотите добавить запись, если какое-либо число не равно нулю, измените all на any .

Если вам нужны 2 (или более) словаря, используйте цикл с дополнительными условиями:

 a = {}
b = {}
for key, value in orig_dict.items():
    if all(value):
        if key in range(77, 82):
            a[key] = value
        elif key in range(95, 100):
            b[key] = value
 

Комментарии:

1. Если я правильно прочитал вопрос, то у вас ошибка. Вам нужно any() , а не all() .

2. @StuartBerg Текущая формулировка и пример немного неоднозначны, я добавлю уточнение

3. Спрашивающий мог бы уточнить, сообщив нам, что должно произойти с записью типа (64, 68, 150, 153, 0) , если такие значения возможны в их данных.

4. Спасибо!! Но как я могу иметь два вложенных словаря? один содержит ключ из 77-81, а другой содержит 95-99?

5. @ Stuart Berg такие записи невозможны в соответствии с определением проблемы. Спасибо!