2013-09-18 4 views
1

Я долгое время боролся с этим и нуждался в некоторой помощи, у меня есть какие-то петли, которые ищут что-то и динамически создают для них словарь, например i я просматриваю магазин, затем все ведра, а затем фрукты внутри этих ведер.динамически создает defaultdict (list) внутри другого defaultdict (tree)

from collections import defaultdict 


def tree(): return defaultdict(tree) 

test = tree() 

test[Store][bucket][fruits] = defaultdict(list) 

test[Store][bucket][fruits].append(1) 

print test 

""" 
desired output 

{ 
    'Store':{ 
     'bucket1':{ 
      'fruits':['banana', 'mango', 'apple'] 
      } 
     }, 
     'bucket2':{ 
      'fruits':['banana', 'mango', 'apple'] 
      } 
     } 
} 
""" 

этот подход выдает сообщение об ошибке и не работают, и я пробовал много других подходов, как создания различных словарей, а затем объединять их, или создать список, а затем искать или найти и бла-бла .. но я хотел бы чтобы узнать, как я могу объединить объекты defaultdict внутри друг друга. Может кто-то, пожалуйста, помогите мне с этим.

Спасибо.

+0

Это может быть лучше взять глубину в качестве параметра для функции фабрики вместо возвращения 'defaultdict (TREE)' , – user2357112

+0

'def tree (depth): return defaultdict (list if depth == 1 else lambda: tree (depth-1))' – user2357112

ответ

2

Учитывая ваш желаемый результат, я не думаю, что вам нужно использовать defaultdict(list).

Скорее, вы можете использовать обычный список:

from collections import defaultdict 

def tree(): 
    return defaultdict(tree) 

test = tree() 

test['Store']['bucket']['fruits'] = [] 
test['Store']['bucket']['fruits'].append(1) 
test['Store']['bucket-13']['fruits'] = ['mango', 'apple', 'banana'] 

print test 

Однако, если вы хотите использовать defaultdict(list), причину, почему он бросает ошибку, потому что это один уровень слишком низок в вашей иерархии. Вы хотите, чтобы назначить его на уровне «ведро», а затем «фрукты» уровень:

test = tree() 

test['Store']['bucket'] = defaultdict(list) 

test['Store']['bucket']['fruit'].append('mango') 
test['Store']['bucket']['meat'].append('chicken') 

# 'fruit' and 'meat' now default to an empty list 
+0

Спасибо, но все же у меня проблема с моим кодом .. в моей петле вроде этого. 'для магазина, ведра, фрукты в поисках:. тест [магазин] [ведро] = defaultdict (список) тест [магазин] [ведро] [ 'плод'] добавить (плоды)' тогда я только получить последний плод в каждом списке ... – abhishekgarg

+0

Спасибо, Майкл, я использовал ваше решение, и оно решило мою проблему. – abhishekgarg

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