2016-06-23 126 views
0

我在python非常新手,我目前正在学习这门语言。我发现数组(关联数组)被称为python中的字典({}) 我正面临一个问题。我需要建立一个字典并在for循环中更新它。我的代码如下。Python更新字典到字典

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中的字典。

+2

您预期的结果'loc'不是字典,因为它不包含键和值。在一个词典的字典中,你的键值是字典。你打算用什么作为钥匙?为什么'loc'需要成为词典的词典?如您的底部结果所示,一系列的字典似乎正常工作。 – MattDMo

+0

字典是一个键值对(由关键字索引)。现在外字典的关键是什么? – SuperSaiyan

+0

为什么loc是一本字典? –

回答

1

你说什么是你想要的输出:

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。 A list是保存一系列元素的前往数据结构。通过指数的它

for i in loc: 
    print(i) 

或访问元素:您可以遍历它

loc[2] 

这可能是你想要的。还有更多你可以用它做,比如slice它,但我不会在这里找到一切。

您在示例代码中调用的update函数用于获取输入dict中的每个密钥,并为其添加密钥/值对或更新现有密钥的值。您可能会认为这是将“dict”参数“合并”为点之前的那个。这就是为什么它每次都重写所有的值。这就是它应该如何工作。 Python的文档非常好,当你的行为不符合你的期望时,你就想养成咨询的习惯。

+0

感谢jpmc26获取重要信息 – user280960

2

如果id是独一无二的,它似乎更可能是你真正想要的只是一个dict映射idstatus

for res in result: 
    loc[res.id] = res.status 

如果您遍历loc.viewitems()(PY 3中,只loc.items()),你会得到tuple s表示对每个idstatus; Python使用tuple作为“匿名轻量级对象”的排序,因此它与您尝试构建的dictset非常类似。用这样的方式,可以通过id高效地查找值(loc[someid],会得到相关status如果id存在或者提高KeyError),同时仍然能够有效地遍历他们:

for ID, status in loc.viewitems(): 
    # do stuff with ID and status 

dictlist A S使查找O(n)任务(其中dict普通dict大致为O(1)查找),并使迭代更难看一点,要求您使用operator.itemgetter来编写类似的解包环路,或者需要手动查找每个项目的idstatus ,这是丑陋的至少。它的记忆效率也低得多;相对于单个较大的dict,每两个项目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) 
+0

感谢ShadowRanger – user280960

0

您可以通过添加新条目或键值对,修改现有条目,或删除现有条目更新词典,如图所示简单的例子

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