嵌套字典理解以避免空值

Nested dictionary comprehension to avoid empty values

我有一个 api 调用 returns 一个包含所有用户所有 ID 的字典 和其他人一样获得 userDetails

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

我正在尝试使用类似 userId 的键和类似信息的值将整个结构打包到字典中。

我可以使用它:

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

问题是,并非所有 ID returns 都会像您看到的 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