Python - вложенный dict против хэширования кортежа? - PullRequest
1 голос
/ 10 января 2011

Мне интересно, каковы плюсы / минусы вложенных диктов по сравнению с хэшированием кортежа в Python?

Контекст представляет собой небольшой скрипт для назначения "мастерских" участникам на конференции.

Каждый семинар имеет несколько атрибутов (например, неделя, день, предмет и т. Д.).Мы используем четыре из этих атрибутов, чтобы назначить семинары для каждого участника - т.е. у каждого делегата будет также неделя / день / тема и т. Д.

В настоящее время я использую вложенный словарь для хранения своих семинаров:1007 *

workshops = defaultdict(lambda: defaultdict(lambda:defaultdict(lambda:defaultdict(dict))))

with open(input_filename) as input_file:
    workshop_reader = csv.DictReader(input_file, dialect='excel')

    for row in workshop_reader:
        workshops[row['Week ']][row['Stream']][row['Strand']][row['Day']] = row

return workshops

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

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

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

Во-вторых - как я могу добиться аналогичного эффекта, используя кортежи в качестве ключа?Есть ли какие-либо преимущества использования такого подхода?Будет ли он намного чище или проще в использовании?(Это все разворачивает, это немного больно, и я не думаю, что это очень доступно).

Или есть какие-то другие структуры данных, которые вы могли бы порекомендовать, которые могут быть лучше / проще для доступа / манипулирования?

Спасибо, Виктор

Ответы [ 2 ]

7 голосов
/ 10 января 2011
class Workshop(object):
  def __init__(self, week, stream, strand, day, name):
    self.week = week
    self.stream = stream
    self.day = day
    self.strand = strand
    self.name = name

...
for row in workshop_reader:
  workshops['name'] = Workshop(...)

Это только , если имя является уникальным атрибутом семинаров (то есть, семинаров без повторяющихся имен).
Кроме того, вы сможете легко назначить идентификатор каждому объекту семинара в словаре семинаров.

3 голосов
/ 10 января 2011

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

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