比较多个嵌套字典中公共键的值

Comparing the values of common keys in multiple Nested Dictionaries

下面是Input_dict的数据分析:

input_dict =
 { 
    "C:\arm64\lib_apple.so": { "func-abc": [5,6,7,8], "func-123":[1,1,1,1] },
    "C:\arm64\lib_banana.so": { "func-123": [2,3,4], "func-rt": [0,0] },
    "C:\armeabi\lib_banana.so": { "func-123": [1,0,0], "func-rt": [1,5] },
    "C:\armeabi\lib2.so": { "func-0": [1]},
    "C:\x86\lib_apple.so": { "func-so": [5,6,7,8], "func-123": [2,2,1,1] },
    "C:\x86\lib_banana.so": { "func-rt": [2,0] }, 
    "C:\x86\lib2.so": { "func-0": [1,2,3]}
 }

目的是比较'values'不同架构(arm64,armeabi,x86)的同名函数。 换句话说,我想比较不同库(.so)文件中的函数(具有相同名称)的“列表”。

例如:比较 func-123: [2,3,4]func-123: [1,0,0] 来自 arm64\lib_banana.so 和 armeabi\lib_banana.so 分别。

所需的输出之一可能是:

{ lib_apple.so: { func-123: [arm64,[1,1,1,1]],[x86,[2,2,1,1]]}}

您可以重组您的函数数据以先按名称排序,然后按支持的体系结构排序。之后,打印出那些在多个架构中出现的函数:

from collections import defaultdict
from pathlib import PureWindowsPath

lib2func = {
    r'C:\arm64\lib_apple.so': { 'func-abc': [5,6,7,8], 'func-123': [1,1,1,1] },
    r'C:\arm64\lib_banana.so': { 'func-123': [2,3,4], 'func-rt': [0,0] },
    r'C:\armeabi\lib_banana.so': { 'func-123': [1,0,0], 'func-rt': [1,5] },
    r'C:\armeabi\lib.so': {},
    r'C:\armeabi\lib2.so': { 'func-0': [1]},
    r'C:\x86\lib_apple.so': { 'func-so': [5,6,7,8], 'func-123': [2,2,1,1] },
    r'C:\x86\lib_banana.so': { 'func-rt': [2,0] },
    r'C:\x86\lib2.so': { 'func-0': [1,2,3] },
}
# restructure
func2arch = defaultdict(dict)
for lib_path, functions in lib2func.items():
    path = PureWindowsPath(lib_path)
    lib = path.name
    arch = path.parent.name
    for func_name, func_val in functions.items():
        func2arch[(lib, func_name)][arch] = func_val

# find functions defined for multiple architectures
for (lib, func_name), arch_data in func2arch.items():
    if len(arch_data) < 2:
        continue # skip functions that only appear once
    print(lib, func_name, arch_data)

给予

lib_apple.so func-123 {'arm64': [1, 1, 1, 1], 'x86': [2, 2, 1, 1]}
lib_banana.so func-123 {'arm64': [2, 3, 4], 'armeabi': [1, 0, 0]}
lib_banana.so func-rt {'arm64': [0, 0], 'armeabi': [1, 5], 'x86': [2, 0]}
lib2.so func-0 {'armeabi': [1], 'x86': [1, 2, 3]}

以上代码假定 library/function 个名称对是唯一的。