Внутри списка dicts обработка всех пар ключ-значение за одну итерацию - PullRequest
0 голосов
/ 27 июня 2019

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

У меня есть файл json, который состоит из спискасловари.В упрощенном виде:

[
{"": "0", "a": "3893", "b": "2389", "c": "1209"}, 
{"": "1", "a": "4308", "b": "4560", "c": "9127"},
... 
] 

Я хочу просмотреть это для каждого словаря и для каждой пары ключ-значение (исключая первую, предполагая, что она будет пропущена, потому что ключ пуст) за итерацию, имеядоступ к парам a, b, c kv одного dict, чтобы они обрабатывались индивидуально.

Я пытался:

import json

with open("file.json", "r") as read_file:
    data = json.load(read_file)

    result_list = []
    for d in data:
        result_list.append([v for k,v in d.items()])

    for k, v in enumerate(result_list.items()): 
        # process each key-value pair

Но я получаю следующую ошибку:

Traceback (most recent call last):
  File "somescript.py", line 28, in <module>
    for k, v in enumerate(result_list.items()): 
AttributeError: 'list' object has no attribute 'items'

Тем временем я пытался:

import json

with open("file.json", "r") as read_file:
data = json.load(read_file)

for i in data:
    print(i, data[i])

И получаю:

  Traceback (most recent call last):
  File "somescript.py", line 26, in <module>
    print(i, dat[i])
TypeError: list indices must be integers or slices, not dict

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

Ответы [ 3 ]

1 голос
/ 27 июня 2019

Первая часть вашей проблемы заключается в вызове перечисления:

    for k, v in enumerate(result_list): # take off the .items())
        # process each key-value pair

Вы не вызываете .items () в result_list;enumerate использует его в виде списка.

Отвечая на вторую проблему:

import json

with open("file.json", "r") as read_file:
data = json.load(read_file)

for i in data:
    print(i, data[i])

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

for item in data:
    for key in item:
        print(key, item[key])

для учета двойной разыменования.

0 голосов
/ 27 июня 2019
    result_list = []
    for d in data:
        result_list.append([v for k,v in d.items()])

Это создает список списков. Обратите внимание, что когда вы делаете это, вы выбрасываете ключи в своих словарях. Это, вероятно, не то, что вы хотите.

    for k, v in enumerate(result_list.items()): 
        # process each key-value pair

Вы получаете здесь ошибку, потому что result_list - это список, а не словарь. В списках нет метода с именем items().

Вместо этого я предлагаю вам перебрать data напрямую. Нет необходимости в result_list:

for d in data:
    for k, v in d.items():
        # process each key-value pair
0 голосов
/ 27 июня 2019

Вы должны иметь возможность загрузить весь список, не перестраивая его, просто используя json.load, затем итерируя по нему и диктуя

import json

with open("file.json", "r") as read_file:
    data = json.load(read_file)

for d in data:
    for i, (k, v) in enumerate(d.items()):
        print(i, k, v)

При этом я предлагаю вам сохранить файл как обычный файл JSONтак как кажется, что первый ключ / значение в каждом dict должен быть полем ID, поэтому он должен выглядеть следующим образом:

{  
    "0": {
        "a":"3893",
        "b":"2389",
        "c":"1209"
    },
    "1": {
        "a":"4308",
        "b":"4560",
        "c":"9127"
    }
}

Что вы можете сделать, используя понимание dict:

with open("file.json", 'w') as out_file:
    json.dump({d.pop(""): d for d in data}, out_file, indent=4)

Тогда все, что вам нужно сделать, это просто перебрать слова:

with open("file.json", "r") as read_file:
    data = json.load(read_file)

    for _id, item in data.items():
        for k, v in item.items():
            print(_id, k, v)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...