嵌套字典理解以避免空值

时间:2017-06-08 15:51:35

标签: python python-3.x dictionary dictionary-comprehension dict-comprehension

我有一个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 }

但我无法使其发挥作用。

任何人都知道怎么做?

1 个答案:

答案 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