Построение 5-уровневой древовидной структуры в питоне - PullRequest
1 голос
/ 27 марта 2012

Я хочу уменьшить количество попаданий в базу данных для получения данных.Поэтому я думаю, что сбор целых данных в дерево повысит производительность системы, поскольку я не буду часто обращаться к базе данных.

Я новичок в python, поэтому, пожалуйста, помогите и посоветуйте мне в создании дереваструктура.

Ответы [ 2 ]

1 голос
/ 27 марта 2012

Вы можете использовать вложенные словари .Вложенный означает, что значением пары ключ: значение может быть другой словарь.


JerseyMike привел хороший пример, я просто хочу отметить, что его функция addItemAttributes эквивалентна более краткой
def addItemAttributes(tree, idList):
    (menu, cat, subcat, item, attribs) = idList;

    currDict = tree.setdefault(menu, {})\
        .setdefault(cat, {})\
        .setdefault(subcat, {})\
        .setdefault(item, {})

    for a in attribs:
        currDict[a[0]] = a[1]

... и что вы можете обернуть getItemAttributes в блок tryтак что вы можете справиться со случаем, когда один из ключей отсутствует, например.

try:
    getItemAttributes(...)
except KeyError:
    #key was incorrect, deal with the situation
0 голосов
/ 27 марта 2012

Я собираю это на лету, так как у меня нет удобного интерпретатора Python.Вот две функции для заполнения и чтения из вложенных структур словаря.Первый параметр, передаваемый каждому, - это базовый словарь, в котором будет храниться вся информация о вашем меню.

Эта функция используется для добавления в словари.Эта функция, возможно, может быть более эффективной, с точки зрения кода, но я хотел, чтобы вы поняли, что происходит.Для каждого элемента каждой подкатегории каждой категории меню вам нужно будет составить список передаваемых атрибутов.

# idList is a tuple consisting of the following elements:
#    menu: string   - menu name
#    cat: string    - category name
#    subcat: string - subcategory name
#    item: string   - item name
#    attribs: list  - a list of the attributes tied to this item in the form of
#                     [('Price', '7.95'),('ContainsPeanuts', 'Yes'),('Vegan', 'No'),...].
#                     You can do the attribs another way, this was convenient for
#                     the example.

def addItemAttributes(tree, idList):
    (menu, cat, subcat, item, attribs) = idList;

    if not tree.has_key(menu):  # if the menu does not exist...
        tree[menu] = {}         # Create a new dictionary for this menu
    currDict = tree[menu]       # currDict now holds the menu dictionary

    if not currDict.has_key(cat): # if the category does not exist...
        currDict[cat] = {}        # Create a new dictionary for this category
    currDict = currDict[cat]      # currDict now holds the category dictionary

    if not currDict.has_key(subcat): # if the subcategory does not exist...
        currDict[subcat] = {}        # Create a new dictionary for this subcategory
    currDict = currDict[subcat]      # currDict now holds the subcategory dictionary

    if not currDict.has_key(item): # if the category does not exist...
        currDict[item] = {}        # Create a new dictionary for this category
    currDict = currDict[item]      # currDict now holds the category dictionary

    for a in attribs
        currDict[a(0)] = a(1)

Функция для чтения из вложенной структуры более проста для понимания:

# Understand that if any of the vaules passed to the following function
# have not been loaded, you will get an error.  This is the quick and
# dirty way.  Thank you to Janne for jarring my mind to the try/except.

def getItemAttributes(tree, menu, cat, subcat, item):
    try:
        return tree[menu][cat][subcat][item].items()
    except KeyError:
        # take care of missing keys

Надеюсь, это поможет.:)

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