[英]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.