创建字典尝试理解
Create dict try 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])
怎么了?
dict.setdefault 是 returns None 的就地方法,因此您正在创建 set 的 None's
作为集合不能有重复留给你 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]}
像上面的 d 这样的 index dict 会得到更新,但是使用任何对副作用的理解都不是一个好的方法。即使使用字典理解,您也无法复制 for loops/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)
这个:
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])
怎么了?
dict.setdefault 是 returns None 的就地方法,因此您正在创建 set 的 None's
作为集合不能有重复留给你 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]}
像上面的 d 这样的 index dict 会得到更新,但是使用任何对副作用的理解都不是一个好的方法。即使使用字典理解,您也无法复制 for loops/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)