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

时间:2014-08-07 22:48:26

标签: python json dictionary

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

以下奇怪的行为只发生在某些api调用上,即返回的唯一内容是单个字典对象。我想更多地了解这种行为,以及如何解决它。

问题是python正在将.json()返回的字典对象转换为

上的列表
ret += res.json()

线。

但是,代码适用于返回字典列表,混合类型列表等的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'emails':[]}

     

[u'activities',u'notes',u'emails']

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

4 个答案:

答案 0 :(得分:1)

我认为您打算使用.append()代替+=。让我们看一个例子:

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

打印:

[1, 2, 3, 'value']

这正是你所观察到的。当您使用+=时,它只会附加json(字典&#39; s)键。

如果您使用过这样的.append()

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

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

答案 1 :(得分:1)

当您运行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}]

答案 2 :(得分:0)

不,它正在做正确的事。当你迭代一个字典时,你得到它的键。 list += iterable迭代右侧并将其添加到列表中。因为右侧是一个字典,所以它的键被添加到列表中。

答案 3 :(得分:0)

不仅仅是

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

alist += adict相当于alist.extend(iter(adict))

iter(adict)会返回adict

的键

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