猿问

使用具有 If/Else 条件的字典理解从 API 响应中选择键/值对

我已经编译了一个名为“user_responses”的 API 响应列表。这是列表中响应的示例:


{

    "ok": true,

    "members": [

        {

            "id": "W012A3CDE",

            "team_id": "T012AB3C4",

            "name": "spengler",

            "deleted": false,

            "color": "9f69e7",

            "real_name": "spengler",

            "tz": "America/Los_Angeles",

            "tz_label": "Pacific Daylight Time",

            "tz_offset": -25200,

            "profile": {

                "avatar_hash": "ge3b51ca72de",

                "status_text": "Print is dead",

                "status_emoji": ":books:",

                "real_name": "Egon Spengler",

                "display_name": "spengler",

                "real_name_normalized": "Egon Spengler",

                "display_name_normalized": "spengler",

                "email": "spengler@ghostbusters.example.com",

                "image_24": "https://.../avatar/e3b51ca72dee4ef87916ae2b9240df50.jpg",

                "image_32": "https://.../avatar/e3b51ca72dee4ef87916ae2b9240df50.jpg",

                "image_48": "https://.../avatar/e3b51ca72dee4ef87916ae2b9240df50.jpg",

                "image_72": "https://.../avatar/e3b51ca72dee4ef87916ae2b9240df50.jpg",

                "image_192": "https://.../avatar/e3b51ca72dee4ef87916ae2b9240df50.jpg",

                "image_512": "https://.../avatar/e3b51ca72dee4ef87916ae2b9240df50.jpg",

                "team": "T012AB3C4"

            },

        },

    ],


我想建立一本字典,其中包括:


1. 一个键,即用户的真实姓名。如果用户没有真实名称,那么我想使用该用户的显示名称。


为此,我尝试在字典理解中使用三元表达式来处理 if/else 条件:


{(sub_dict['profile']['real_name'] if 'real_name' in sub_dict['profile] 

  else sub_dict['profile']['display_name']):value

  for response in user_responses

  for sub_dict in response.get('members')}

这似乎只是默认为每个用户使用显示名称,这不是我想要的。


2. 一个值,它是每个用户的所有图像的列表。


为此,我想我可以编写一个列表理解,其中包含以“图像”一词开头的所有键的值。


{(key:[sub_dict['profile'][k] for k in sub_dict['profile'] if k.startswith('image')]

  for response in user_responses

  for sub_dict in response.get('members')}

有更好的方法来实现这一点吗?预先感谢您的任何帮助。


温温酱
浏览 85回答 1
1回答

www说

将 for 循环简化为推导式的一个好方法是首先使用常规 for 循环来可视化该过程:newLst = []for member in var["members"]:    d = {"images": []}    for k, v in member["profile"].items():        if k.startswith("image"):            d["images"].append(v)    d["name"] = member["profile"].get("real_name")    if not d["name"]:        member["profile"].get("display_name")    newLst.append(d)现在,我个人会选择上面的 for 循环。然而,你的问题是如何使用理解来解决它,所以这是我的版本:newLst = [{"images": [v for k, v in member["profile"].items() if k.startswith("image")],            "name": member["profile"].get("real_name", member["profile"].get("display_name"))} for member in var["members"]]它们两者的最大区别在于第一个很容易调试,或者至少遵循逻辑。而第二个则很难真正遵循。两者的结果:[{'images': ['https://.../avatar/e3b51ca72dee4ef87916ae2b9240df50.jpg',             'https://.../avatar/e3b51ca72dee4ef87916ae2b9240df50.jpg',             'https://.../avatar/e3b51ca72dee4ef87916ae2b9240df50.jpg',             'https://.../avatar/e3b51ca72dee4ef87916ae2b9240df50.jpg',             'https://.../avatar/e3b51ca72dee4ef87916ae2b9240df50.jpg',             'https://.../avatar/e3b51ca72dee4ef87916ae2b9240df50.jpg'],  'name': 'Egon Spengler'}, {'images': ['https://a.slack-edge.com...png',             'https://a.slack-edge.com...png',             'https://a.slack-edge.com...png',             'https://a.slack-edge.com...png',             'https://a.slack-edge.com...png',             'https://a.slack-edge.com...png',             'https://a.slack-edge.com...png',             'https://a.slack-edge.com...png'],  'name': 'Glinda Southgood'}]
随时随地看视频慕课网APP

相关分类

Python
我要回答