我有一个api调用,它返回一个包含所有用户所有ID的字典
和其他人一样得到userDetails
:
>>> allIds=api.getAllIds()
{1,2,3,4,5}
>>> userDetails=api.getUserDetails(1)
{'name':'Bob','age':'19'}
我正在尝试使用userId
- 类似键和类似信息的值将整个结构打包到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)
,一个取值另一个是检查是否不是。
所以我正在尝试嵌套字典理解之类的东西:
users = {(x,y) for x in usersIds for y in api.getUserDetails(x) if y!=None }
但我无法使其发挥作用。
任何人都知道怎么做?
答案 0 :(得分:4)
您可以将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}
但是,为此设置嵌套循环是相当浪费的,使用vanilla for
循环构建字典可能更具可读性:
users = {}
for x in usersIds:
y = api.getUserDetails(x)
if y is not None:
users[x] = y