下面是使用尝试生成dict的dict列表
data = [
{'date': datetime.date(2011, 8, 14), 'name': u'ab', 'total': 8},
{'date': datetime.date(2011, 8, 15), 'name': u'ab', 'total': 8},
{'date': datetime.date(2011, 8, 16), 'name': u'ab', 'total': 8},
{'date': datetime.date(2011, 8, 17), 'name': u'ab', 'total': 8},
{'date': datetime.date(2011, 8, 18), 'name': u'ab', 'total': 8},
{'date': datetime.date(2011, 8, 19), 'name': u'ab', 'total': 8},
{'date': datetime.date(2011, 8, 20), 'name': u'ab', 'total': 8},
{'date': datetime.date(2011, 8, 21), 'name': u'ab', 'total': 8},
{'date': datetime.date(2011, 8, 18), 'name': u'aj', 'total': 0},
{'date': datetime.date(2011, 8, 14), 'name': u'ap', 'total': 8},
{'date': datetime.date(2011, 8, 15), 'name': u'ap', 'total': 8},
{'date': datetime.date(2011, 8, 16), 'name': u'ap', 'total': 8},
{'date': datetime.date(2011, 8, 17), 'name': u'ap', 'total': 8},
{'name': u'ab', 'l_total': 8, 'type': u'UP'},
{'name': u'ab', 'l_total': 8, 'type': u'PL'},
{'name': u'fk', 'l_total': 29, 'type': u''},
{'name': u'jw', 'l_total': 1, 'type': u'PD'},
{'name': u'uk', 'l_total': 16, 'type': u'UP'},
{'name': u'sk', 'l_total': 24, 'type': u'PL'},
{'name': u'ss', 'l_total': 8, 'type': u'PL'},
{'name': u'sst', 'l_total': 8, 'type': u'PL'}]
results = collections.defaultdict(dict)
for fetch in data:
user = fetch['name']
hrs = fetch['total']
row = results[user]
new_y = fetch['type']
row['new_y'] = fetch['l_total']
row['user'] = user
dt_string = str(fetch['date'])
if dt_string in fetch and row[dt_string] != hr:
raise Exception, "Contradiction: '%s' on '%s'" % (user, dt_string)
row[dt_string] = hrs
row.setdefault('Total', 0)
row['Total'] += hrs
生成低于输出
{u'ap': {'Total': 32, 'user': u'ap', '2011-08-17': 8,
'2011-08-16': 8, '2011-08-15': 8, '2011-08-14': 8,
'up': 8, 'PL':8})
获取密钥错误,任何帮助都非常感谢
注意:在这里您可以找到两种类型的词组:{'date':datetime.date(2011,8,14),'name':u'ab','total':8 },另一个是{'name':u'ab','total':8,'type':u'UP'} ,.两者之间的区别是关键。在第一个词典中你找到日期键和另一个词典类型键
答案 0 :(得分:6)
为什么不应该你得到一个KeyError?您要求type
的第一行中与data
相关联的值,并且没有此类密钥。
修改强>
@agf说这没什么用,所以让我再试一次。
data
的第一行是
{'date': datetime.date(2011, 8, 14), 'name': u'ab', 'total': 8}
循环fetch
中的(顺便说一句,变量应该以名词命名,而不是动词;函数名称是动词)设置为第一行,然后执行以下行:
new_y = fetch['type']
嗯,那条线不能成功。 type
中没有fetch
的条目,因此,正如您所见,Python会引发KeyError。更改数据,以便有这样的条目或更改代码,使其不需要它。
答案 1 :(得分:0)
尝试对“日期”和“类型”键进行边界检查:
for fetch in data:
if "date" in fetch and "type" in fetch:
user = fetch['name']
hrs = fetch['total']
row = results[user]
new_y = fetch['type']
row['type'] = fetch['l_total']
row['user'] = user
dt_string = str(fetch['date'])
if dt_string in fetch and row[dt_string] != hr:
raise Exception, "Contradiction: '%s' on '%s'" % (user, dt_string)
row[dt_string] = hrs
row.setdefault('Total', 0)
row['Total'] += hrs
更好的方法是检查dict中的每个元素是否具有您需要的所有键。
check = ["name", "total", "user", "type", "1_total", "date"]
for fetch in data:
if all([i in fetch for i in check]):
user = fetch["name"]
. . .