我有一个数据结构
id
length
我已成功添加到具有以下代码的列表中
data = [{"id":1,"name":"a"},{"id":2,"name":"b"},{"id":3,"name":"c"}]
def id_extract(data):
total = []
cur_count = {"count": length(data)}
total.append(cur_count)
for i in data:
j = {"id": i["id"]}
total.append(j)
return total
def length(data):
return(len(data))
id_extract(data)
但是,如果我需要更新到词典,则会出错。
示例json在下面。如果需要添加到词典中,请尝试以下代码。我收到错误消息:
UnboundLocalError: local variable 'total' referenced before assignment
data = [{"id":1,"name":"a"},{"id":2,"name":"b"},{"id":3,"name":"c"}]
def id_extract(data):
myDict = {}
myDict.update( {'values': total} )
cur_count = {"count": length(data)}
total = []
for i in data:
j = {"id": i["id"]}
total.append(j)
return myDict
def length(data):
return(len(data))
id_extract(data)
我的期望值是
{'count': 3,'values' : [{'id': 1}, {'id': 2}, {'id': 3}]}
答案 0 :(得分:2)
我想向您展示问题所在,如何解决以及我们如何改进解决方案。
如果在使用总变量之前将其放置在初始化总变量的位置,您的代码就会起作用。
在您的版本中,您在实例化它之前就使用它,这就是为什么您得到 UnboundLocalError:赋值之前引用的局部变量'total'的原因错误。
这是解决方法,一旦完成,就很容易操作结果字典,以便在其中添加包含长度的“ count”字段:
data = [{"id":1,"name":"a"},{"id":2,"name":"b"},{"id":3,"name":"c"}]
def id_extract(data):
total = [] # I put the total variable initialization before its usage
myDict = {}
myDict.update( {'values': total} )
cur_count = {"count": len(data)}
for i in data:
j = {"id": i["id"]}
total.append(j) # As explained total must be initialized BEFORE we use it here
result = {}
result['count'] = len(data)
result['values'] = myDict['values']
return result
print(id_extract(data))
代码按预期工作。
我们可以改善它,什么看起来呢?
例如为什么要使用两个字典?
我建议直接将数据直接放入您的结果字典来对其进行优化:
data = [{"id":1,"name":"a"},{"id":2,"name":"b"},{"id":3,"name":"c"}]
def id_extract(data):
result = {'count': len(data), 'values' : []}
for i in data:
result['values'].append({"id": i["id"]})
return result
print(id_extract(data))
已经好了吧?
我们可以利用Python's List Comprehensions的力量来进一步改善它:
列表理解为创建列表提供了一种简洁的方法。共同 应用程序将创建新列表,其中每个元素都是 应用于另一个序列的每个成员的某些操作,或 迭代,或创建满足以下条件的元素的子序列 一定条件。
data = [{"id":1,"name":"a"},{"id":2,"name":"b"},{"id":3,"name":"c"}]
def id_extract(data):
result = {'count': len(data)}
result['values'] = [{"id": item["id"]} for item in data]
return result
print(id_extract(data))
在这一点上,我们将按照迄今为止使用的相同技术继续进行优化,然后以最终形式(对我来说是:))获得函数:
data = [{"id":1,"name":"a"},{"id":2,"name":"b"},{"id":3,"name":"c"}]
def id_extract(data):
return {'count': len(data), 'values' : [{"id": item["id"]} for item in data]}
print(id_extract(data))
输出
{'count': 3, 'values': [{'id': 1}, {'id': 2}, {'id': 3}]}
答案 1 :(得分:2)
正确的代码。您在初始化之前分配了total
。
data = [{"id":1,"name":"a"},{"id":2,"name":"b"},{"id":3,"name":"c"}]
def id_extract(data):
total = []
for i in data:
j = {"id": i["id"]}
total.append(j)
return {'count': len(data), 'values': total}
id_extract(data)
答案 2 :(得分:1)
您可以使用内置Python库的defaultdict
来创建列表字典。然后将count
键列表值替换为数字
创建默认字典的示例是dict_of_list = defaultdict(list)
要为键添加值:dict_of_list[value].append(some_val)
答案 3 :(得分:0)
很多好的答案,但是您可以内联整个内容:
data = [{"id":1,"name":"a"},{"id":2,"name":"b"},{"id":3,"name":"c"}]
extract = {'count': len(data), 'values': [{"id": i["id"]} for i in data]}