Внутри списка dicts обработка всех пар ключ-значение за одну итерацию

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

У меня есть файл 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

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

0
задан sergei_22 26 June 2019 в 23:07
поделиться

3 ответа

    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
ответ дан Code-Apprentice 26 June 2019 в 23:07
поделиться

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

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

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

Ответ на вторую из Ваших проблем:

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])

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

1
ответ дан jhelphenstine 26 June 2019 в 23:07
поделиться

Вы должны быть в состоянии загрузить весь список, не перестраивая его, просто используя 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"
    }
}

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

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)
0
ответ дан Jab 26 June 2019 в 23:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: