创建字典尝试理解

时间:2016-10-03 09:28:53

标签: python-2.7 dictionary dictionary-comprehension

这:

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])

怎么了?

1 个答案:

答案 0 :(得分:0)

dict.setdefault 是一个返回None的inplace方法,因此您创建了一个{em> set None's,因为集合不能重复,所以留下set([None]) 1}}:

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]}

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

你可以做的是使用带有list.extend的 defaultdict

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)