Проблемы с добавлением в список в словаре - PullRequest
0 голосов
/ 28 января 2020

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

Для этого я использую следующий фрагмент кода:

artifact_content_data = {}
for i in range(0,len(content_data)):
    for key in json.loads(dict(content_data.loc[i])['content_data']).keys():
        if key in artifact_content_data:
            print('Key exists')
            print(json.loads(dict(content_data.loc[i])['content_data'])[key])
            print(type(json.loads(dict(content_data.loc[i])['content_data'])[key]))
            print(artifact_content_data[key])
            artifact_content_data[key] = artifact_content_data[key].append(json.loads(dict(content_data.loc[i])['content_data'])[key])
            print(artifact_content_data)
            print('\n')
        else:
            print('Key does not exist')
            print(key)
            print(json.loads(dict(content_data.loc[i])['content_data'])[key])
            artifact_content_data[key] = [json.loads(dict(content_data.loc[i])['content_data'])[key]]
            print(artifact_content_data)
            print('\n')

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

    Key does not exist
type1
0
{'type1': [0]}


Key does not exist
type2
0
{'type1': [0], 'type2': [0]}


Key does not exist
type3
0
{'type1': [0], 'type2': [0], 'type3': [0]}


Key does not exist
type4
0
{'type1': [0], 'type2': [0], 'type3': [0], 'type4': [0]}


Key does not exist
type5
0
{'type1': [0], 'type2': [0], 'type3': [0], 'type4': [0], 'type5': [0]}


Key exists
0
<class 'int'>
[0]
{'type1': None, 'type2': [0], 'type3': [0], 'type4': [0], 'type5': [0]}


Key exists
1
<class 'int'>
[0]
{'type1': None, 'type2': None, 'type3': [0], 'type4': [0], 'type5': [0]}


Key exists
2
<class 'int'>
[0]
{'type1': None, 'type2': None, 'type3': None, 'type4': [0], 'type5': [0]}


Key exists
1
<class 'int'>
[0]
{'type1': None, 'type2': None, 'type3': None, 'type4': None, 'type5': [0]}


Key exists
0
<class 'int'>
[0]
{'type1': None, 'type2': None, 'type3': None, 'type4': None, 'type5': None}


Key exists
0
<class 'int'>
None
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-174-b1cf77736794> in <module>()
      7             print(type(json.loads(dict(content_data.loc[i])['content_data'])[key]))
      8             print(artifact_content_data[key])
----> 9             artifact_content_data[key] = artifact_content_data[key].append(json.loads(dict(content_data.loc[i])['content_data'])[key])
     10             print(artifact_content_data)
     11             print('\n')

AttributeError: 'NoneType' object has no attribute 'append'

Мы ясно видим, что когда l oop попадает в блок «Ключ существует», он не добавляется в список. Вместо этого он делает значение None. Я не уверен, почему это произошло.

Я печатаю все соответствующие значения в моем l oop, чтобы помочь выяснить проблему.

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

1 голос
/ 28 января 2020

Чтобы сделать это простым, используйте collection.defaultdict :

d = defaultdict(list)

Это буквально делает именно то, что вы просили: «Если ключ существует, то я хотел бы добавить к список. Если значение не существует, я хотел бы создать список. "

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

1 голос
/ 28 января 2020

list.append ничего не возвращает. Итак, следующая строка:

artifact_content_data[key] = artifact_content_data[key].append(json.loads(dict(content_data.loc[i])['content_data'])[key])

Эффективно добавляет в список, затем перезаписывает список в словаре с помощью None. Просто добавьте в существующий список, не нужно назначать клавишу:

artifact_content_data[key].append(json.loads(dict(content_data.loc[i])['content_data'])[key])
...