【发布时间】:2011-12-21 05:36:28
【问题描述】:
我想找到在 python 中迭代 key 值的最佳方式。
我有这种结构的文件:
17 键1
18 键1
45 键2
78键2
87键2
900 键3
92键4
所以我需要将第二列设置为键(不重复)并将与其对应的所有值(第一列)链接到该键。
'key1':['17','18']
'key2':['45','78','87']
'key3':['900']
'key4':['92']
到目前为止,我没有使用字典:
for line in file:
value, key = line.strip().split(None,1)
然后我可以用
将它放入字典中 diction.setdefault(key, []).append(value)
所以在那之后我有一本我需要的不错的字典。
但在那之后我必须重新读取文件以进行更改。更改可能发生在键(对)中(添加/删除)或仅发生在值中(添加/删除)如何检查迭代键值是否发生更改?
更新***: 对于键检查或多或少清楚:
if diction[key]:
但是如何在键中迭代值呢? 我需要找出差异,然后从字典中添加\删除这个值\pair(如果键的最后一个值)?
我想它可以用一些 iteritem()\itervalues() 或 smthng 来完成,但我不熟悉。
感谢您的帮助。
更新***
谢谢@Joël。最后我用了3张支票。首先是添加的任何键:
set_old_dict = set(new_old.keys())
set_new_dict = set(new_dict.keys())
intersect = set_new_dict.intersection(set_old_dict)
def added(self):
return set_new_dict - intersect
def removed(self):
return set_old_dict - intersect
如果我没有捕捉到或已经处理过这种情况,我将使用你的函数:
def comp(old_dict, new_dict):
for key, old_val in old_dict.items():
new_val = new_dict[key]
print 'evolutions for', key
print 'new content:', [x for x in new_val if x not in old_val]
print 'removed content:', [x for x in old_val if x not in new_val]
【问题讨论】:
-
每次更新文件时不要重建整个字典对您来说重要吗?
-
实际上,不要使用
if diction[key]:,使用if key in diction:。 -
如果我将
18 key1更改为17 key1,diction['key1']应该包含两个17的副本还是只有一个?顺序重要吗?如果文件一开始就是这样呢? -
谢谢你。我尝试这种方式。不,顺序无关紧要。
标签: python dictionary iteration