2009-12-11 4 views
2

У меня есть случай, когда мне нужно построить следующую структуру программно (да, я отдаю себе отчет в .setdefault и defaultdict, но я не могу получить то, что я хочу)Список словарей, в словаре - в Python

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

Структура выборки (пожалуйста, обратите внимание, что я хочу, чтобы создать массив, который имеет такую ​​структуру в коде!)

RULE = { 
    'hard_failure': { 
     4514 : { 
      'f_expr' = 'ABC', 
      'c_expr' = 'XF0', 
    } 
    } 
    } 

псевдо-код, который необходимо создать так:

... 
self.rules = {} 
for row in rows: 
    a = 'hard_failure' 
    b = row[0] # 4514 
    c = row[1] # ABC 
    d = row[2] # XF0 
    # Universe collapse right after 
    self.rules = ???? 
... 

Код выше очевидно, не работает, так как я не знаю, как это сделать!

+0

ваш образец не является допустимым питон – SilentGhost

+1

Try быть более ясным, ваша структура выборки не имеет никакого смысла. Вы не можете использовать синтаксис 4514: {} внутри квадратных скобок. –

ответ

5

Пример, который Вы отправили не правильный код питона, я только мог себе представить, что вы пытаетесь сделать что-то вроде этого:

self.rules[a] = [{b:{'f_expr': c, 'c_expr': d}}] 

таким образом self.rules является словарь из списка словарь словаря. Бьюсь об заклад, существует более разумный способ сделать это.

+0

+1 для «Держу пари, что есть более разумный путь» – chucksmash

0

Ваш пример кода не является действительным Python. Неясно, является ли элемент второго уровня списком или словарем.

Однако, если вы делаете то, что я думаю, что вы делаете, и это словарь, вы можете использовать кортеж в качестве ключа в словаре верхнего уровня вместо гнездовых словарей:

>>> a = 'hard_failure' 
>>> b = 4514 
>>> c = "ABC" 
>>> d = "XF0" 
>>> rules = {} 
>>> rules[(a,b)] = {'f_expr' : a,'c_expr' : d} 
>>> rules 
{('hard_failure', 4514): {'c_expr': 'XF0', 'f_expr': 'hard_failure'}} 
1
rules = {} 
failure = 'hard_failure' 
rules[failure] = [] 
for row in rows: 
    #this is what people are referring to below. You left out the addition of the dictionary structure to the list. 
    rules[failure][row[0]] = {} 
    rules[failure][row[0]]['type 1'] = row[1] 
    rules[failure][row[0]]['type 2'] = row[2] 

Это то, что я создал на основе того, как я понял вопросы. Я не был уверен, что назвать «f_expr» и «c_expr», так как вы никогда не упоминаете, где вы их получаете, но я полагаю, что они уже знают имена столбцов в наборе результатов или структуре какого-то рода.

Просто продолжайте добавлять к структуре по ходу дела.

0

Ну, извиняюсь за замешательство, я никогда не утверждал, что код действительно скомпилирован, следовательно (псевдо). Артур Томас поставил меня на правильный путь, вот немного измененная версия. (Да, теперь сво просто вложен словарь, 3 уровня вниз)

RULE_k = 'hard_failure' 
    self.rules = {} 
    for row in rows: 
      self.rules_compiled.setdefault(RULE_k, {}) 
      self.rules_compiled[RULE_k][row[1]] = {} 
      self.rules_compiled[RULE_k][row[1]]['f_expr'] = row[0] 
      self.rules_compiled[RULE_k][row[1]]['c_expr'] = row[1] 
+1

Правильный способ справиться с этим в переполнении стека - это изменить свой вопрос, чтобы прояснить все это, вместо того, чтобы вставить «ответ», который не может быть ответом. Если это действительно ответ, а затем принять его, нажав на значок галочки слева. В противном случае люди, пришедшие сюда позже, не поняли, что вы делаете. –

Смежные вопросы