Сравнение значений общих ключей в нескольких вложенных словарях

Ниже приведен 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).

Например: сравнение 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]]}}

Сравнивать как? Каков ваш ожидаемый результат? Пожалуйста, также включите ваш текущий код и его вывод или ошибки.

Jan Wilamowski 17.05.2022 07:19

@JanWilamowski Я упомянул желаемый результат. Однако я не закодировал ничего существенного из-за его сложной природы. Нужна ваша помощь с кодом.

BoRRis 17.05.2022 09:26
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
2
31
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]}

Приведенный выше код предполагает, что пары имен библиотека/функция уникальны.

Здесь есть то, что я искал.

BoRRis 17.05.2022 23:57

Другие вопросы по теме