繁体   English   中英

Python 将字典更新为字典

[英]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映射到statusdict

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

dictlist使查找成为O(n)任务(其中普通dict大约为O(1)查找),并使迭代变得更难看,需要您使用operator.itemgetter编写一个类似的循环进行解包,或者需要手动查找每个项目的idstatus ,这至少可以说是丑陋的。 它在内存方面的效率也低得多; 相对于单个较大的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM