比较多个嵌套字典中公共键的值
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 个名称对是唯一的。
下面是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 个名称对是唯一的。