Получить родительский (ключ) из значения (элемент, хранящийся в списке) - PullRequest
0 голосов
/ 21 сентября 2019

Я застрял в проблеме, в которой мне нужно найти общий «родитель» элементов в списке.

Вот проблема -

У меня есть справочный файл - hierarchy.jsonи этот файл загружается как словарь в моем суперклассе.

{
    "DATE": ["ISO", "SYSTEM", "HTTP"],
    "IP": ["IPv4", "IPv6"],
    "PATH": ["UNIX", "WINDOWS"]
}

В качестве входных данных я получаю list значений и ожидаю получить набор элементов , которые принадлежатк тому же родителю (ссылаясь на файл hierarchy.json) в качестве вывода.Еще лучше, если бы я мог получить имя родителя, это было бы здорово.

input_list = ["ISO", "UNIX", "HTTP"]

result = do_something(input_list)

print('RESULT:\t', result)

>>> RESULT:    set("ISO","HTTP")

По сути, я хочу сделать наборы элементов, которые принадлежат разным "родителям" в элементе.

Я знаю, что это можно сделать O(n^3), просматривая каждый элемент списка.Это очевидно не лучший способ достижения результата.

Вот что я пробовал -

def do_something(input_list: list, reference_dir: dict) -> list:
    result_list = []
    for lists in reference_dir.values():
        results = []
        for i in input_list:
            for j in input_list:
                if i != j:
                    if set([i,j]).issubset(set(lists)):
                        results.extend(set([i,j]))
        result_list.append(set(results))
    return result_list

input_list = ["ISO", "UNIX", "HTTP", "SYSTEM","WINDOWS"]
reference_dir = {"DATE": ["ISO", "SYSTEM", "HTTP"],"IP": ["IPv4", "IPv6"],"PATH":["UNIX", "WINDOWS"]}

result = do_something(input_list, reference_dir)
print('RESULT:\t', (result))

>>> RESULT:  [{'SYSTEM', 'HTTP', 'ISO'}, set(), {'UNIX', 'WINDOWS'}]

Есть ли способ оптимизировать это / реализовать это влучший способ?

Отредактировано (добавлено) ->

ТАКЖЕ,

, если бы я мог получить имя 'parent' в качестве вывода, это было быбыть УДИВИТЕЛЬНЫМ.

>>> RESULT:  [DATE, PATH]

Спасибо.

1 Ответ

2 голосов
/ 21 сентября 2019
def do_something(input_list: list, reference_dir: dict) -> list:
    sets_1 = {k: set() for k in reference_dir.keys()}
    sets_2 = {item: sets_1[k] for k, list in reference_dir.items() for item in list}
    for input in input_list:
        sets_2[input].add(input)
    return sets_1

reference_dir = {
    "DATE": ["ISO", "SYSTEM", "HTTP"],
    "IP": ["IPv4", "IPv6"],
    "PATH": ["UNIX", "WINDOWS"]
}

input_list = ["ISO", "UNIX", "HTTP"]

print(do_something(input_list, reference_dir))

Отпечатки:

{'DATE': {'HTTP', 'ISO'}, 'IP': set(), 'PATH': {'UNIX'}}

Что делает do_something:

  1. sets_1 = {k: set() for k in reference_dir.keys()} В этой строке создается словарь, в котором каждый ключ является формой ключа reference_dir изначение - пустой набор.
  2. sets_2 = {item: sets_1[k] for k, list in reference_dir.items() for item in list} Эта строка создает другой словарь.Ключи - это элементы списков, которые являются значениями словаря reference_dir, а значением для каждого ключа является соответствующий пустой набор, созданный на шаге 1, связанный с ключом, владеющим списками.
  3. for input in input_list: sets_2[input].add(input) Каждый элементinput_list добавляется в соответствующий набор, используя словарь, созданный на шаге 2, для выбора правильного набора.
  4. return sets_1 Возвращает словарь, ключами которого являются все ключи в reference_dir и значения которого теперь являются заполненными наборами (некоторые из которых могут быть пустыми).Ключи - это «названия» наборов, которые вы искали.

См. Демонстрацию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...