如何将列表追加到字典

时间:2020-10-06 15:17:28

标签: python

我有一个数据结构

  • 我有两个功能
  • 一个函数返回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}]}

4 个答案:

答案 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]}