Установка значений в словаре для всех нулей - PullRequest
0 голосов
/ 15 февраля 2020

Если у меня есть этот dict:

dict1 = {"Key1": [[1, 3, 4], [2, 5, 8]], "key2": [4, 5]}

Как мне установить все значения на 0?

Вывод должен быть таким:

dict1 = {"Key1": [[0,0,0], [0,0,0]], "key2": [0,0]}

Ответы [ 3 ]

3 голосов
/ 15 февраля 2020

Вы можете сделать это с помощью рекурсивной функции, которая обнуляет каждый элемент списка или словаря, который ему передан:

dict1 = { "Key1" :[ [1, 3, 4], [2 , 5 , 8]], "key2" : [4, 5] }

def zero(e):
    if type(e) is list:
        return [zero(v) for v in e]
    elif type(e) is dict:
        return {k : zero(v) for k, v in e.items()}
    return 0

dict1 = zero(dict1)
print(dict1)

Вывод:

{'Key1': [[0, 0, 0], [0, 0, 0]], 'key2': [0, 0]}

Обратите внимание, что это генерирует новый словарь, а не мутирующий оригинальный.

1 голос
/ 15 февраля 2020

Вы можете изменить словарь «на месте», т.е. не заменяя его новым, с помощью относительно простой рекурсивной функции:

def zero_values(obj):
    if isinstance(obj, dict):
        for k, v in obj.items():
            obj[k] = zero_values(v)
        return obj
    elif isinstance(obj, list):
        for i, v in enumerate(obj):
            obj[i] = zero_values(v)
        return obj
    else:
        return 0

dict1 = { "Key1" :[ [1, 3, 4], [2 , 5 , 8] ], "key2" : [4, 5] }
zero_values(dict1)
print(dict1)  # -> {'Key1': [[0, 0, 0], [0, 0, 0]], 'key2': [0, 0]}
0 голосов
/ 15 февраля 2020

Вы можете изменить свои значения dict1, чтобы самые внутренние списки имели только 0 в качестве элементов:

def change_to_zero(nested_list):
    if isinstance(nested_list[0], list):
        for l in nested_list:
            change_to_zero(l)
    else:
         nested_list[::] = [0] * len(nested_list)

change_to_zero(list(dict1.values()))

print(dict1)

вывод:

{'Key1': [[0, 0, 0], [0, 0, 0]], 'key2': [0, 0]}

этот подход предполагает, что ваши dict значения являются списками разных уровней вложенности, и самый внутренний список не имеет списков в качестве элементов, только целые числа (для вашего примера)

...