在python中通过键迭代字典多个值

时间:2011-11-03 14:13:19

标签: python dictionary iteration

我想找到在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]

1 个答案:

答案 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中的密钥是添加内容。

请在答案中公布您的结果,以便其他人可以从中受益。