[英]Python update dictionary into dictionary
我是 Python 的新手,目前正在学习这门语言。 我发现数组数组(关联数组)在 python ({}) 中被称为字典我面临一个问题。 我需要构建一个字典并在for
循环中更新它。 我的代码如下。
loc = {}
result = { I get the list of records from database here, which has id and status }
for res in result:
temp={}
temp['id']= res.id
temp['status'] = res.status
loc.update(temp) # this replaces the values every time, i want append
print loc
以下是我预期的结果:
loc = { {'id' : 123 , 'status' : 'available' },
{ 'id' : 456 , 'status' : 'unavailable'}
}
有人可以帮助我。 我试过:
loc = [] # [] this works with loc.append(temp)
this gives result as :
[{'id' : 123 , 'status' : 'available'},{'id' : 456 , 'status' : 'unavailable'}]
但是我需要上面的结果和python中的字典。
如果id
是唯一的,那么您真正想要的似乎更有可能只是将id
映射到status
的dict
。
for res in result:
loc[res.id] = res.status
如果你迭代loc.viewitems()
(在 Py3 中,只是loc.items()
),你会得到tuple
s,它将每个id
与其status
配对; Python 使用tuple
s 作为某种“匿名轻量级对象”,因此它的工作方式与您尝试构建的dict
s set
非常相似。 用这样的方式,可以通过查找值id
有效( loc[someid]
会得到相关的status
,如果id
存在或者提高KeyError
),同时仍然能够有效地迭代它们:
for ID, status in loc.viewitems():
# do stuff with ID and status
dict
的list
使查找成为O(n)
任务(其中普通dict
大约为O(1)
查找),并使迭代变得更难看,需要您使用operator.itemgetter
编写一个类似的循环进行解包,或者需要手动查找每个项目的id
和status
,这至少可以说是丑陋的。 它在内存方面的效率也低得多; 相对于单个较大的dict
每两个 item dict
支付相当大的内存开销。
如果您真的希望它的行为更像 JS 对象,则要考虑的另一种选择是使用collections.namedtuple
。 这有点像dict
; 您使用点语法访问属性,而不是使用括号语法访问键,但它的内存效率更高,并且它是不可变的,因此它可以放在一个set
:
from collections import namedtuple
Record = namedtuple('Record', 'id status')
loc = {Record(res.id, res.status) for res in result}
然后,您可以使用namedtuple
像一个普通的tuple
(这样for ID, status in loc:
作品),或使用指定的属性访问而不是:
for record in loc:
print(record.id, record.status)
你说的是你想要的输出:
loc = {
{'id' : 123 , 'status' : 'available' },
{'id' : 456 , 'status' : 'unavailable'}
}
不会是dict
。 如果它有效,那将是set
。
但是set
不能包含dict
因为它不可哈希。 集合只能包含可散列元素,因为它使用散列进行快速查找。 (一个可散列的项目要么是完全不可变的,要么它经历的任何变化都不会影响散列。请注意,不影响散列意味着它也不会影响平等。通常,确保可散列的东西不可变更容易。)
在字典中,您必须有一个键和一个值。 您所需的输出并未描述每个内部dict
的键,因此dict
不是您想要的数据结构。 您可能想要的正是您发现的有效方法:
loc = [
{'id' : 123 , 'status' : 'available' },
{'id' : 456 , 'status' : 'unavailable'}
]
这是一个list
。 list
是保存元素序列的首选数据结构。 你可以迭代它:
for i in loc:
print(i)
或通过索引访问它的元素:
loc[2]
这可能就是你想要的。 你可以用它做更多的事情,比如切片,但我不会在这里介绍所有内容。
您在示例代码中调用的update
函数用于获取输入dict
中的每个键,并向其添加键/值对或更新现有键的值。 您可能会认为这是将dict
参数“合并”到点之前的参数中。 这就是为什么它每次都覆盖所有值; 这就是它应该如何工作。 Python 的文档非常好; 你想养成在某些事情不像你期望的那样表现时咨询它的习惯。
您可以通过添加新条目或键值对、修改现有条目或删除现有条目来更新字典,如下面的简单示例所示
dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
dict['Age'] = 8; # update existing entry
dict['School'] = "DPS School"; # Add new entry
print "dict['Age']: ", dict['Age']
print "dict['School']: ", dict['School']
来源: iodocs
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.