首页 > 解决方案 > 请根据以下代码解释“defaultdict”概念

问题描述

payload = {'format': 'json', 'per_page': '500', 'date':'1990:2016'}
r = requests.get('http://api.worldbank.org/v2/countries/br;cn;us/indicators/NY.GDP.MKTP.CD', params=payload)


from collections import defaultdict
data = defaultdict(list)

for entry in r.json()[1]:
    if data[entry['country']['value']]:
        data[entry['country']['value']][0].append(int(entry['date']))
        data[entry['country']['value']][1].append(float(entry['value']))       
    else: 
        data[entry['country']['value']] = [[],[]] 

print(data)

我是否正确理解'if'语句是'False',因为字典是空的:'{'Brazil': [], 'China': [], 'United States': []})', 因此' else:' 首先执行以允许追加?

标签: python

解决方案


您的理解似乎正确,但代码很差。

首先,它并没有真正利用defaultdict(),这应该消除了对if测试的需要。它可以很容易地使用普通字典,通过测试

if entry['country']['value'] in data:

其次,当条目为空时(因为它是默认值),它会创建嵌套列表,但不会将循环的当前条目添加到其中。

此处使用的正确方法是使用defaultdict()创建嵌套列表的回调函数。

from collections import defaultdict
data = defaultdict(lambda: [[],[]])

for entry in r.json()[1]:
    data[entry['country']['value']][0].append(int(entry['date']))
    data[entry['country']['value']][1].append(float(entry['value']))       

print(data)

推荐阅读