мой ввод выглядит так:
test_file = [['ref1', 'test1', 2],
['ref2', 'test1', 3],
['ref3', 'test2', 4],
['ref1', 'test2', 4],
['ref2', 'test2', 1],
['ref1', 'test1', 4],
['ref1', 'test1', 5]]
И я пытаюсь получить вложенный словарь следующим образом:
desired_output = {'ref1':{'test1':[2,5,4]},
'ref1':{'test2':[4]},
'ref2':{'test1':[3]},
'ref2':{'test2':[1]},
'ref3':{'test2':[4]}}
Я попытался использовать defaultdict, добавив значения ко второму ключу, однако получил эту ошибку:
AttributeError: объект collections.defaultdict не имеет атрибута «добавить»
Итак, я попробовал это:
for entry in test_file:
nest1 = {}
try:
nest1[entry[1]].append(entry[2])
except KeyError:
nest1[entry[1]] = [entry[2]]
try:
mynestdict[entry[0]].append(nest1)
except KeyError:
mynestdict[entry[0]] = [nest1]
print(dict(mynestdict))
Но я получаю это:
{'ref1': [{'test1': [2]}, {'test2': [4]}, {'test1': [4]}, {'test1': [5]}],
'ref2': [{'test1': [3]}, {'test2': [1]}],
'ref3': [{'test2': [4]}]}
Я не знаком с вложенными словарями и очень хотел бы в них разобраться, есть предложения?
желаемый результат недействителен, у вас не может быть дубликатов ключей ref1
.
словарь ditto имеет дублирующую ключевую альтернативу, которая может быть '{"ref1":{"test1":[2,4,5],"test2":[4]},"ref2":{"test1":[3], "test2":[1]},"ref3":{"test2":[4]}}'
Поскольку вы создаете вложенные словари, вам нужны вложенные defaultdict()
.
result = defaultdict(lambda: defaultdict(list))
for key1, key2, value in test_file:
result[key1][key2].append(value)
pprint(default_to_regular(result))
# Output:
{'ref1': {'test1': [2, 4, 5], 'test2': [4]},
'ref2': {'test1': [3], 'test2': [1]},
'ref3': {'test2': [4]}}
Получить default_to_regular()
от Как преобразовать defaultdict of defaultdicts [of defaultdicts] в dict of dicts [of dicts]?
Я думаю, что результат, который вы ищете, это комбинация повторяющихся ключей:
{'ref1': {'test1': [2, 4, 5], 'test2': [4]}, 'ref2': {'test1': [3], 'test2': [1]}, 'ref3': {'test2': [4]}}
Для этого просто проверьте, существуют ли вложенные ключи, а если нет, то создайте их. Вы просили код, который не использует collections.defaultdict
, и это не делает его слишком большим:
test_file = [['ref1', 'test1', 2],
['ref2', 'test1', 3],
['ref3', 'test2', 4],
['ref1', 'test2', 4],
['ref2', 'test2', 1],
['ref1', 'test1', 4],
['ref1', 'test1', 5]]
d = {}
for el in test_file:
if el[0] not in d:
d[el[0]] = {}
if el[1] not in d[el[0]]:
d[el[0]][el[1]] = []
d[el[0]][el[1]].append(el[2])
print(d)
test_file = [['ref1', 'test1', 2],
['ref2', 'test1', 3],
['ref3', 'test2', 4],
['ref1', 'test2', 4],
['ref2', 'test2', 1],
['ref1', 'test1', 4],
['ref1', 'test1', 5]]
df = pd.DataFrame(test_file)
df.groupby([0, 1])[2].apply(np.array).unstack().agg(lambda x: x.dropna().to_dict(), axis=1).to_json()
'{"ref1":{"test1":[2,4,5],"test2":[4]},"ref2":{"test1":[3],"test2":[1]},"ref3":{"test2":[4]}}'
Покажите свой код с помощью
defaultdict()
, чтобы мы могли помочь вам исправить его.