Как выбрать словарь, используя определенные ключи в Python? - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть такой JSON data и у меня около 100 вопросов. Как я могу отфильтровать вопрос только до 40?

Это образец данных:

data=[{"id": "AA11",
"resp": [
    {"answer": "A","number": 1},
    {"answer": "A","number": 2},
    {"answer": "B","number": 3},
    {"answer": "D","number": 4},
    {"answer": "E","number": 5}
]},
{"id": "AA22",
"resp": [
    {"answer": "A","number": 1},
    {"answer": "A","number": 2},
    {"answer": "B","number": 3},
    {"answer": "D","number": 4},
    {"answer": "E","number": 5}
]},
{"id": "AA33",
"resp": [
    {"answer": "A","number": 1},
    {"answer": "A","number": 2},
    {"answer": "B","number": 3},
    {"answer": "D","number": 4},
    {"answer": "E","number": 5}
]}]

Могу ли я извлечь данные только до номера 3, как, например, в данном случае ?

Вывод:

data=[{"id": "AA11",
"resp": [
    {"answer": "A","number": 1},
    {"answer": "A","number": 2},
    {"answer": "B","number": 3}
]},
{"id": "AA22",
"resp": [
    {"answer": "A","number": 1},
    {"answer": "A","number": 2},
    {"answer": "B","number": 3}
]},
{"id": "AA33",
"resp": [
    {"answer": "A","number": 1},
    {"answer": "A","number": 2},
    {"answer": "B","number": 3}
]}]

Ответы [ 4 ]

2 голосов
/ 02 апреля 2020

Путь Pythoni c был бы пониманием:

filtered = [{'id': d['id'], 'resp': [x for x in d['resp'] if x['number'] <= 3]}
            for d in data]

Это дает, как и ожидалось:

[{'id': 'AA11',
  'resp': [{'answer': 'A', 'number': 1},
           {'answer': 'A', 'number': 2},
           {'answer': 'B', 'number': 3}]},
 {'id': 'AA22',
  'resp': [{'answer': 'A', 'number': 1},
           {'answer': 'A', 'number': 2},
           {'answer': 'B', 'number': 3}]},
 {'id': 'AA33',
  'resp': [{'answer': 'A', 'number': 1},
           {'answer': 'A', 'number': 2},
           {'answer': 'B', 'number': 3}]}]
2 голосов
/ 02 апреля 2020
for item in data:
    item['resp'] = item['resp'][:3]
1 голос
/ 02 апреля 2020

Фильтрация до указанного c элемента должна выполняться следующим образом

def filter(question,num):
    temp = {}
    for key in question:
        temp[key] = question[key]
    temp['resp'] = question['resp'][:num]
    return temp

def filter_list(questions,num):
    temp = []
    for question in questions:
        temp.append(filter(question,num))
    return temp

data = [{}...]
filtered_data = filter_list(data)


Вы заметите, что filter создает копию question и только изменяет копию. Это может быть полезно для изменения структур данных, но рекомендуется использовать структуры данных как неизменяемые, где это возможно.

В качестве бонуса вы не потеряете никакие исходные данные таким образом

1 голос
/ 02 апреля 2020

Попробуйте:

new_data = data[0:40]
for item in new_data:
    item['resp'] = item['resp'][0:3]

Это решение создаст новый словарь с ожидаемыми значениями.

...