繁体   English   中英

嵌套字典的列表理解

[英]List comprehension with nested dictionaries

我正在尝试实例化下面描述的对象,这些对象基于下面 json 数据中可见的嵌套字典formInstances['responses']

class

class ReponseGroupInstance:
    def __init__(self, id, questions,parentId):
        self.id = id
        self.questions = questions
        self.parentId = parentId

json 数据

data = r'''{
    "formInstances": [
        {
            "formVersion": 1.0,
            "deviceIdentifier": "cheaper",
            "dataPointId": "439350001",
            "submissionDate": "2022-10-04T08:21:08Z",
            "modifiedAt": "2022-10-04T09:36:04.187Z",
            "id": "405190001",
            "responses": {
                "388540003": [
                    {
                        "382720001": {
                            "filename": "HELP!",
                            "location": null
                        },
                        "382720002": "12",
                        "382720003": [
                            {
                                "text": "Median"
                            }
                        ]
                    }
                ],
                "388540001": [
                    {
                        "386430059": "2020-10-04T08:19:37.673Z",
                        "386430060": "t",
                        "386430061": [
                            {
                                "text": "MamaZoe"
                            }
                        ],
                        "386430062": [
                            {
                                "text": "Train"
                            }
                        ],
                        "386430063": [
                            {
                                "text": "Now"
                            }
                        ],
                        "386430064": {
                            "lat": -100.3582283333333334,
                            "long": 500.92758333333334,
                            "elev": 21512,
                            "code": null
                        }
                    }
                ]
            },
            "identifier": "qasddqt-asdas-r1er",
            "displayName": "asjdasd",
            "formId": "4521354",
            "surveyalTime": 515,
            "submitter": "papa-noel",
            "createdAt": "2020-1-0904T09:35:59.556Z"
        }
    ],
}'''

我面临的挑战是ReponseGroupInstance.parentId对应的数据点是我循环的嵌套字典之外的字典的键。

我已经能够通过嵌套的 for 循环和构造函数解决这个问题,如下所示,并尝试使用并行列表理解,如下所示,但没有成功——给定嵌套字典之外的列表属性的不同列表长度不使用我的 zip() 方法。

for循环

def question_group_instance_factory(id, questions,parentId):
    return QuestionGroupInstance(id, questions,parentId)

for form_instance in data["formInstances"]:
    parent_id = form_instance['id']
    for id,questions in form_instance['responses'].items():
        question_group_instance_factory(id,questions,parent_id)

列表理解尝试

l_question_g_val = [[question_g_val[0] for question_g_val in form_instance['responses'].values()] for form_instance in data["formInstances"]]
l_question_g_key = [[question_g_key for question_g_key in form_instance['responses'].keys()] for form_instance in data["formInstances"]]

l_form_parent_id = [form_instance['id'] for form_instance in data["formInstances"]]

pprint([question_group_instance_factory(id,questions,parent_id)for id,questions,parent_id in zip(*l_question_g_key,*l_question_g_val,l_form_parent_id)])

我怎样才能避免 for 循环? 最好通过列表理解?

谢谢!

class FormResponse:
    def __init__(self, response_id, form_name, form_id, date_submitted, form_data):
        self.response_id = response_id
        self.form_name = form_name
        self.form_id = form_id
        self.date_submitted = date_submitted
        self.form_data = form_data

The function should take the json data as an argument and return a list of FormResponse objects.

JSON data:
{
  "formInstances": {
    "formName": "My Form",
    "formId": "12345",
    "responses": [
      {
        "response_id": "1",
        "date_submitted": "2020-07-31T20:49:12.000Z",
        "form_data": {
          "name": "John Doe",
          "age": "30",
          "gender": "Male"
        }
      },
      {
        "response_id": "2",
        "date_submitted": "2020-07-31T20:49:12.000Z",
        "form_data": {
          "name": "Jane Doe",
          "age": "25",
          "gender": "Female"
        }
      }
    ]
  }
}

def instantiate_form_responses(json_data):
    form_responses = []
    form_name = json_data['formInstances']['formName']
    form_id = json_data['formInstances']['formId']
    responses = json_data['formInstances']['responses']
    
    for response in responses:
        response_id = response['response_id']
        date_submitted = response['date_submitted']
        form_data = response['form_data']
        form_response = FormResponse(response_id, form_name, form_id, date_submitted, form_data)
        form_responses.append(form_response)
    
    return form_responses

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM