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

如何解决使用带有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"
            },"is_admin": true,"is_owner": false,"is_primary_owner": false,"is_restricted": false,"is_ultra_restricted": false,"is_bot": false,"updated": 1502138686,"is_app_user": false,"has_2fa": false
        },{
            "id": "W07QCRPA4","team_id": "T0G9PQBBK","name": "glinda","real_name": "Glinda Southgood","profile": {
                "avatar_hash": "8fbdd10b41c6","image_24": "https://a.slack-edge.com...png","image_32": "https://a.slack-edge.com...png","image_48": "https://a.slack-edge.com...png","image_72": "https://a.slack-edge.com...png","image_192": "https://a.slack-edge.com...png","image_512": "https://a.slack-edge.com...png","image_1024": "https://a.slack-edge.com...png","image_original": "https://a.slack-edge.com...png","first_name": "Glinda","last_name": "Southgood","title": "Glinda the Good","phone": "","skype": "","real_name_normalized": "Glinda Southgood","display_name": "Glinda the Fairly Good","display_name_normalized": "Glinda the Fairly Good","email": "glenda@south.oz.coven"
            },"updated": 1480527098,"has_2fa": false
        }
    ],"cache_ts": 1498777272,"response_Metadata": {
        "next_cursor": "dXNlcjpVMEc5V0ZYTlo="
    }
}

我想建立一个包含以下内容的字典

1。一个密钥,即用户的real_name。如果没有用户的真实姓名,那么我想为该用户使用display_name。

为此,我尝试在字典理解中使用三元表达式来处理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')}

这似乎只是认情况下,为每个用户使用display_name,这不是我想要的。

2。该值是每个用户的所有图像的列表。

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

{(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')}

是否有更好的方法可以做到这一点?预先感谢您的帮助。

解决方法

一种将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'],'name': 'Egon Spengler'},{'images': ['https://a.slack-edge.com...png','https://a.slack-edge.com...png','https://a.slack-edge.com...png'],'name': 'Glinda Southgood'}]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?