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



下面是用于数据分析的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]}
}

目的是比较不同架构(arm64,armeabi,x86)中同名函数的"值"。换句话说,我想比较"列表"。不同库(.so)文件中的函数(同名)

例如:比较arm64lib_banana的func-123: [2,3,4]func-123: [1,0,0]。armeabilib_banana。所以分别。

期望的输出之一可能是:

{ 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:arm64lib_apple.so': { 'func-abc': [5,6,7,8], 'func-123': [1,1,1,1] },
r'C:arm64lib_banana.so': { 'func-123': [2,3,4], 'func-rt': [0,0] },
r'C:armeabilib_banana.so': { 'func-123': [1,0,0], 'func-rt': [1,5] },
r'C:armeabilib.so': {},
r'C:armeabilib2.so': { 'func-0': [1]},
r'C:x86lib_apple.so': { 'func-so': [5,6,7,8], 'func-123': [2,2,1,1] },
r'C:x86lib_banana.so': { 'func-rt': [2,0] },
r'C:x86lib2.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]}

以上代码假设库/函数名称对是唯一的。

相关内容

  • 没有找到相关文章

最新更新