我有一个 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] 删除。
我来说两句