Храните список материалов в Python - PullRequest
0 голосов
/ 08 июня 2018

Я манипулирую некоторыми данными с Python, который состоит исключительно из номеров деталей и их отношения (родитель / потомок) к другим частям.Детали находятся на многих уровнях спецификации материалов (BOM).Каков наилучший способ хранения этих данных в Python?

Изначально я использовал вложенные словари, как показано ниже, с общими номерами деталей для удобства чтения (реальные имена деталей являются случайными символами).Тем не менее, я не думаю, что хранение данных (имен деталей) в качестве ключа словаря является хорошим способом сделать это, потому что это затрудняет получение имен деталей.

>>> BOM = {}
>>> BOM['Part 1'] = {}
>>> BOM['Part 1']['Part 1.1'] = {}
>>> BOM['Part 1']['Part 1.1']['Part 1.1.1'] = {}
>>> BOM['Part 1']['Part 1.2'] = {}
>>> BOM['Part 1']['Part 1.3'] = {}
>>> BOM['Part 2'] = {}
>>> BOM['Part 2']['Part 2.1'] = {}
>>> BOM['Part 2']['Part 2.2'] = {}
>>> BOM['Part 2']['Part 2.2']['Part 2.2.1'] = {}
>>> print(BOM)

{'Part 1': {'Part 1.1': {'Part 1.1.1': {}}, 'Part 1.2': {}, 'Part 1.3': {}}, 'Part 2': {'Part 2.1': {}, 'Part 2.2': {}, 'Part 2.2.1': {}}}

Если не вложенные словари, как я долженхранить запчасти?Или я должен использовать вложенные словари по-другому?

Ответы [ 3 ]

0 голосов
/ 08 июня 2018

Родительские / дочерние отношения обычно хранятся в виде деревьев. anytree поддерживает такую ​​структуру данных.Это позволит вам также легко получить имя узла.Если части являются просто числами, которые увеличиваются на единицу, как в примере, достаточно простого вложенного списка (тогда индекс и глубина вложенного списка подразумевают имя номера детали).

0 голосов
/ 19 июня 2018

Решение с использованием anytree

from anytree import Node
bom = {} # dictionary with part as key and list of nodes as value, ex. bom[part] = [Node(part), Node(part), ...]
for (part, parent) in part_list:
    if part not in bom:
        # Create key and initialize value if not in bom
        bom[part] = []
    if parent in bom:
        # Add part to all instances of parent
        for parent_node in bom[parent]:
            bom[part].append(Node(part, parent=parent_node))
    else:
        # If part has no parents, just create the node
        bom[part].append(Node(part))
0 голосов
/ 08 июня 2018

По моему опыту, если элемент в словаре не имеет значения, он будет добавлен в виде списка в словаре.Нравится: {'Part 1': {'Part 1.1': ['Part 1.1.1'], 'Part 1.2': {}, 'Part 1.3': {}}, 'Part 2': ['Part 2.1', 'Part 2.2', 'Part 2.2.1']}

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