2016-10-03 33 views
2

此:創建字典嘗試理解

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

的哪些錯誤?

+0

是什麼ARGS這裏?一個例子會有所幫助。 –

回答

0

dict.setdefault是那麼你正在創建一個設置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會得到更新,但使用任何理解副作用不是一個好方法。即使使用詞典理解,也無法複製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)