首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创造试著理解力

创造试著理解力
EN

Stack Overflow用户
提问于 2016-10-03 09:28:53
回答 1查看 51关注 0票数 2

这是:

代码语言:javascript
复制
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']})

作品

但是,当我尝试这个:

代码语言:javascript
复制
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

输出:

代码语言:javascript
复制
result set([None])

出什么事了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-03 11:39:55

dict.setdefault是一个内部方法,它不返回任何内容,因此您正在创建一组None's,因为集合不能重复,所以将您留在set([None])中。

代码语言:javascript
复制
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理解,也不能复制for循环/setdefault逻辑。

您可以做的是在list.extend中使用defaultdict:

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39828412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档