繁体   English   中英

Stange行为:python无意间将字典转换为列表

[英]Stange behavior: python converting a dictionary to a list unintentionally

我正在访问基于Web的API,并使用以下代码作为我的最低抽象级别(带有调试打印)。

以下奇怪的行为只发生在某些api调用上,即唯一返回的对象是单个字典对象的api调用。 我想了解更多有关此行为及其解决方法的信息。

问题是python将.json()返回的字典对象转换为列表中的列表

ret += res.json()

线。

但是,该代码按原样用于API调用,该API返回字典列表,混合类型列表等。

import requests, json, re

def api_get(s):
    username = "username"
    password = ""
    url = 'base_url' + s

    ret = []

    while url != None:
        res = requests.get(url, auth=(username, password))
        print ret
        print res.json()
        ret += res.json()
        print ret
        try:
            url = re.search('<(.+?)>; rel="next"', res.headers['link']).group(1)
        except (AttributeError, KeyError) as e:
            url = None

    return ret

这是此的输出:

[]

{u'activities':[{u'body':u'stuff',u'created_at':u'2014-07-29T05:31:14Z',u'user':无,u'subject':无} ],u'notes':[],u'emails':[]}

[u'活动',u'笔记',u'电子邮件']

如您所见,在ret + = res.json()之后,由res.json()和ret打印的值不一致。

我认为您打算使用.append()而不是+= 让我们看一个例子:

ret = [1, 2, 3]
ret += {'value': 4}
print ret

打印:

[1, 2, 3, 'value']

这正是您所观察到的。 当您使用+=它只会附加json的(字典的)键。

如果您使用过.append()如下所示:

ret = [1, 2, 3]
ret.append({'value': 4})
print ret

你会得到:

[1, 2, 3, {'value': 4}]

当您运行mylist += something类的代码时,Python将尝试遍历something 这等效于运行:

for i in something:
    mylist.append(i)

遍历字典时,会得到其键的列表。

>>> for i in {"a": 1, "b": 2}: print i
a
b

因此,您会看到字典的键已添加到列表中。 如果您只想将字典添加到没有所有这些喧闹声的列表中,则可以使用.append() ,如下所示:

>>> a = []
>>> a.append({"a": 1, "b": 2})
>>> print a
[{'a': 1, 'b': 2}]

不,它做对了。 迭代字典时,会得到其键。 list += iterable迭代右侧,并将其添加到列表中。 由于右侧是字典,因此其键将添加到列表中。

这不只是

alist = []
adict = {'one': 1, 'two', 2, 'three', 3}
alist += adict

alist += adict等同于alist.extend(iter(adict))

iter(adict)返回的键adict

因此,您所描述的行为是预期的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM