Python:如何对 3d 数组的值求和,其中最后一个数组是使用函数映射和求和的字典

Python: How to sum values from a 3d array, where the last array is a dictionary using functional map and sum


(这是 Advent Of Code 第 4 天,我已经有了星星,但我想更有效地完成它)
我有一个像这样的 3d 矩阵:

[
    [
        [{22: 0}, {13: 0}, {17: 1}, {11: 1}, {0 : 1}],
        [{8 : 0}, {2 : 1}, {23: 1}, {4 : 1}, {24: 1}],
        [{21: 1}, {9 : 1}, {14: 1}, {16: 0}, {7 : 1}],
        [{6 : 0}, {10: 0}, {3 : 0}, {18: 0}, {5 : 1}],
        [{1 : 0}, {12: 0}, {20: 0}, {15: 0}, {19: 0}]
    ],

    [
        [{3 : 0}, {15: 0}, {0 : 1}, {2 : 1}, {22: 0}],
        [{9 : 1}, {18: 0}, {13: 0}, {17: 1}, {5 : 1}],
        [{19: 0}, {8 : 0}, {7 : 1}, {25: 0}, {23: 1}],
        [{20: 0}, {11: 1}, {10: 0}, {24: 1}, {4 : 1}],
        [{14: 1}, {21: 1}, {16: 0}, {12: 0}, {6 : 0}]
    ], 
    
    [
        [{14: 1}, {21: 1}, {17: 1}, {24: 1}, {4 : 1}],
        [{10: 0}, {16: 0}, {15: 0}, {9 : 1}, {19: 0}],
        [{18: 0}, {8 : 0}, {23: 1}, {26: 0}, {20: 0}], 
        [{22: 0}, {11: 1}, {13: 0}, {6 : 0}, {5 : 1}], 
        [{2 : 1}, {0 : 1}, {12: 0}, {3 : 0}, {7 : 1}]
    ]
]

我想使用 map/sum 函数对其中一个矩阵的所有值求和。 这就是我现在所拥有的并且可以工作:

# z is one of those matrices, 0, 1 or 2
soma = 0
for line in matrices[z]:  # line is a list of dictionaries
    for dic in line:      # dic is a dictionary from the list
        valor = list(dic.values())[0]
        if valor == 0:
            soma += list(dic.keys())[0]

我尝试过的事情:

print("soma = ", sum(map(sum, ( (value.values())[0] for value in matrizes[z]))))

这不起作用,我收到此错误: 追溯(最近一次通话最后一次):

File "day4.py", line 75, in <module>
print("part 1 = ", sum(map(sum, ((value.values())[0] for value in matrizes[z]))))
File "day4.py", line 75, in <genexpr>
print("part 1 = ", sum(map(sum, ((value.values())[0] for value in matrizes[z]))))
AttributeError: 'list' object has no attribute 'values'

我找到了一个带有二维数组的 post,但不明白如何为 3 维数组制作它。
我还找到了使用“numpy”的帖子,但我想使用 map 和 sum 函数。

你可以这样写一行:

m = [
    [
        [{22: 0}, {13: 0}, {17: 1}, {11: 1}, {0 : 1}],
        [{8 : 0}, {2 : 1}, {23: 1}, {4 : 1}, {24: 1}],
        [{21: 1}, {9 : 1}, {14: 1}, {16: 0}, {7 : 1}],
        [{6 : 0}, {10: 0}, {3 : 0}, {18: 0}, {5 : 1}],
        [{1 : 0}, {12: 0}, {20: 0}, {15: 0}, {19: 0}]
    ],

    [
        [{3 : 0}, {15: 0}, {0 : 1}, {2 : 1}, {22: 0}],
        [{9 : 1}, {18: 0}, {13: 0}, {17: 1}, {5 : 1}],
        [{19: 0}, {8 : 0}, {7 : 1}, {25: 0}, {23: 1}],
        [{20: 0}, {11: 1}, {10: 0}, {24: 1}, {4 : 1}],
        [{14: 1}, {21: 1}, {16: 0}, {12: 0}, {6 : 0}]
    ], 
    
    [
        [{14: 1}, {21: 1}, {17: 1}, {24: 1}, {4 : 1}],
        [{10: 0}, {16: 0}, {15: 0}, {9 : 1}, {19: 0}],
        [{18: 0}, {8 : 0}, {23: 1}, {26: 0}, {20: 0}], 
        [{22: 0}, {11: 1}, {13: 0}, {6 : 0}, {5 : 1}], 
        [{2 : 1}, {0 : 1}, {12: 0}, {3 : 0}, {7 : 1}]
    ]
]

s = sum([k for y in m for x in y for z in x for k,v in z.items() if v == 0])
print(s)

你可以这样做:

z = 0
soma = sum(map(lambda line: sum(k for d in line for k, v in d.items() if v == 0), matrices[z]))
print(soma) # 163