iterate dictionary multiple values by keys in python
我想找到在python中迭代key值的最佳方法。
我有这个结构的文件:
17 key1
18 key1
45 key2
78 key2
87 key2
900 key3
92 key4
号
因此,我需要将第二列设置为键(不重复),并将与之对应的所有值(第一列)链接到此键。
'key1':['17','18']
'key2':['45','78','87']
'key3':['900']
'key4':['92']
号
到目前为止,我不用字典就能做到:
1 2 3 | for line in file: value, key = line.strip().split(None,1) |
然后我可以把它放进字典
1 | diction.setdefault(key, []).append(value) |
号
所以在那之后,我有了一本我需要的好字典。
但在那之后,我必须重新读取文件进行更改。更改可以在键(对)(添加/删除)中发生,也可以仅在值(添加/删除)中发生。如何按值检查迭代键是否发生更改?
更新***:对于钥匙,检查或多或少是清晰的:
1 | if diction[key]: |
但是如何在键内迭代值呢?我需要找出差异,然后从字典中添加删除这个值对(如果键的最后一个值)?
我想可以用一些iteritem()itervalues()或smthng来完成,但我对此并不熟悉。
谢谢你的帮助。
UPD*
谢谢你@jo?最后我用了3张支票。首先是添加的任何键:
1 2 3 4 5 6 7 8 9 10 | 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 |
。
然后,如果我没有捕捉到或者已经处理过这种情况,我将使用您的函数:
1 2 3 4 5 6 | 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] |
我的建议是,如果必须重新读取输入文件,也可以重新创建字典,但这取决于创建字典所需的时间。按照您的要求,也许分析文件中的差异并更新字典会更快。
您可以查看
不幸的是,我敢打赌,你将很难理解它的输出:这意味着它是人类可读的,而不是机器可读的,所以可能会有更好的答案。
编辑如果要跟踪两个文件版本之间的更改(如注释中所写),可以比较字典。对于钥匙,您已经有了所需的。
现在,对于更新的值:如果您确定您的值总是字符串列表,那么您可以执行与比较dict键相同的操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | >>> def comp(old_dict, new_dict): ... for key, old_val in old_dict.items(): ... new_val = new_dict[key] # warning: to be used on keys in both dict ... 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] # now testing on a simple example >>> o = {'key1': ['a', 'b', 'c']} >>> n = {'key1': ['b', 'c', 'd']} >>> comp(o, n) evolutions for key1 new content: ['d'] removed content: ['a'] |
警告:只有当
old_dict 中不在new_dict 中的键被删除;new_dict 中的键和old_dict 中的键是附加的。
请在答案中公布您的结果,以便其他人从中受益。