【问题标题】:Create dict try comprehension创建 dict 尝试理解
【发布时间】:2016-10-03 09:28:53
【问题描述】:

这个:

index ={}
for item in args:
    for array in item:
        for k,v in json.loads(array).iteritems():
            for value in v:
                index.setdefault(k,[]).append({'values':value['id']})

作品

但是,当我尝试这个时:

index ={}
filt = {index.setdefault(k,[]).append(value['id']) for item in args for array in item for (k,v) in json.loads(array).iteritems() for value in v}
print filt

输出:

result set([None])

怎么了?

【问题讨论】:

  • 这里的 args 是什么?一个例子会有所帮助。

标签: python-2.7 dictionary dictionary-comprehension


【解决方案1】:

dict.setdefault 是一个返回 None 的 inplace 方法,因此您正在创建一个 None'sset,因为集合不能有重复项,所以您可以使用 set([None])

In [27]: d = {}

In [28]: print(d.setdefault(1,[]).append(1)) # returns None
None 
In [35]: d = {}

In [36]: {d.setdefault(k,[]).append(1) for k in range(2)} # a set comprehension 
Out[36]: {None}

In [37]: d
Out[37]: {0: [1], 1: [1]}

index 像上面的 d 这样的字典会得到更新,但是对副作用使用任何理解都不是一个好方法。即使使用 dict 理解,您也无法复制 for 循环/setdefault 逻辑。

你可以做的是使用 defaultdict 和 list.extend:

from collections import defaultdict

index = defaultdict(list)
for item in args:
    for array in item:
        for k,v in json.loads(array).iteritems():
            index[k].extend({'values':value['id']} for value in v)

【讨论】:

    猜你喜欢
    • 2015-06-23
    • 1970-01-01
    • 2019-12-27
    • 2021-10-16
    • 1970-01-01
    • 2017-03-01
    • 1970-01-01
    • 2016-03-01
    相关资源
    最近更新 更多