嵌套字典理解以避免空值

胡安

我有一个 api 调用,它返回一个字典,其中包含所有用户和其他人的所有 id 以获得userDetails类似的信息:

>>> allIds=api.getAllIds()
{1,2,3,4,5}
>>> userDetails=api.getUserDetails(1)
{'name':'Bob','age':'19'}

我试图用userId-like 键和类似 info 的值将整个结构打包在一个 dict 中

我可以使它与:

>>> users={id:api.getUserDetails(id) for id in allIds}
{1:{'name':'bob','age':'19'},2:None,3:{'name':'alice','age':'21'},...}

问题在于,并非所有 Id 都会返回响应,正如您在 id 2 调用中看到的那样。我试图不使用传统的循环,我正在解决dict在调用后清理结果的情况

>>> users=[id:users[id] for id in users.keys() if users[id]!=None]

它正在工作,但我试图不放入空值而不是清理。在正常情况下,您可以像这样创建字典:

>>> a=[id:b[id] for id in b.keys() if b[id]!=None ]

但是在我的情况下,如果我检查是否b[i]为 None ......那么我将调用 api 两次,因为我的b[i]表达式是api.getUserDetails(id),一个取值,另一个检查是否不是 None。

所以我正在尝试类似嵌套字典理解的东西:

users = {(x,y) for x in usersIds for y in api.getUserDetails(x) if y!=None }

但我不能让它工作。

有谁知道怎么做?

摩西·科莱多耶

您可以将 api 调用的结果放在单例元组中:

users = {x: y for x in usersIds for y in (api.getUserDetails(x),) if y is not None}

演示:

lst = [(5,6), (2,None)]
d = {k: v for k, x in lst for v in (x,) if v is not None}
print(d)
# {5: 6}

但是,为此设置嵌套循环非常浪费,使用普通for循环构建字典可能更具可读性

users = {}
for x in usersIds:
    y = api.getUserDetails(x)
    if y is not None:
        users[x] = y

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章