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

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]


我的建议是,如果必须重新读取输入文件,也可以重新创建字典,但这取决于创建字典所需的时间。按照您的要求,也许分析文件中的差异并更新字典会更快。

您可以查看difflib模块,然后分析差异。基于此,可以在字典中删除删除,并根据需要添加。

不幸的是,我敢打赌,你将很难理解它的输出:这意味着它是人类可读的,而不是机器可读的,所以可能会有更好的答案。

编辑如果要跟踪两个文件版本之间的更改(如注释中所写),可以比较字典。对于钥匙,您已经有了所需的。

现在,对于更新的值:如果您确定您的值总是字符串列表,那么您可以执行与比较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']

警告:只有当new_dict包含old_dict的所有键时,此功能才有效,否则创建new_val将失败。通过在函数中添加键的比较,您可以轻松解决此问题:

  • old_dict中不在new_dict中的键被删除;
  • new_dict中的键和old_dict中的键是附加的。

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