我想找到在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']
到目前为止,我没有使用字典就这样做了:
for line in file:
value, key = line.strip().split(None,1)
然后我可以用
将它放入字典中 diction.setdefault(key, []).append(value)
所以在那之后,我有一本很好的词典,我需要。
但之后我必须重新读取文件以进行更改。键(对)(添加/删除)或仅在值(添加/删除)中可以发生更改如何检查迭代键是否由值发生更改?
UPD ***: 对于密钥检查或多或少是明确的:
if diction[key]:
但如何迭代键内的值? 我需要找到差异,然后添加\从字典中删除此值\ pair(如果键的最后一个值)?
我想可以用iteritem()\ itervalues()或smthng来完成,但我不熟悉。
感谢您的帮助。
UPD ***
谢谢你@乔尔。最后我用了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]
答案 0 :(得分:1)
我的建议是,如果你必须重新阅读输入文件,你也可以重新创建你的字典,但这取决于字典创建所需的时间。根据您的要求,也许更快地分析文件中的差异,并更新字典。
您可以查看difflib
模块,然后分析差异。基于此,可以在字典中删除删除,并根据需要添加添加。
可悲的是,我打赌你的输出很难:这是人类可读的,而不是机器可读的,所以可能有更好的答案。
编辑如果您想跟踪两个文件版本之间的变化,如评论中所写,您可以比较字典。对于钥匙,您已经拥有了所需的钥匙。
现在,对于更新的值:如果您确定您的值将始终是字符串列表,那么您可以执行与比较dict键完全相同的事情:
>>> 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']
警告:仅当new_dict
包含old_dict
的所有键时,此功能才有效,否则new_val
的创建将失败。通过在函数中添加键的比较,您可以轻松解决这个问题:
old_dict
中不在new_dict
中的密钥已被删除; new_dict
而不是old_dict
中的密钥是添加内容。请在答案中公布您的结果,以便其他人可以从中受益。