嵌套字典理解以避免空值
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
我有一个 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