【问题标题】:iterate dictionary multiple values by keys in python在python中通过键迭代字典多个值
【发布时间】: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 key1diction['key1'] 应该包含两个17 的副本还是只有一个?顺序重要吗?如果文件一开始就是这样呢?
  • 谢谢你。我尝试这种方式。不,顺序无关紧要。

标签: python dictionary iteration


【解决方案1】:

我的建议是,如果您必须重新读取输入文件,您不妨重新创建字典,但这取决于创建字典所需的时间。根据您的要求,分析文件差异和更新字典可能会更快。

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

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


编辑如果您想跟踪两个文件版本之间的更改,如您的评论中所写,您可以比较字典。对于钥匙,您已经拥有所需的东西。

现在,对于更新的值:如果您确定您的值将始终是字符串列表,那么您可以做与比较字典键完全相同的事情:

>>> 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 中的键是添加项。

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

【讨论】:

  • 谢谢乔尔。我遵循您和 nmichaels 的建议,并尝试考虑使用 2 个字典将更改的文件也放在这种类型中。使用集合运算符查找 diff in dictionaries 的好方法。似乎接近我的问题。感谢您的帮助
  • 嗯,如果您在更新的字典中阅读更新的文件,也许按原样使用这个更新的字典会更快:) 如果您想跟踪差异,我更新了我的答案。
  • 谢谢乔尔。最后我用了3张支票。首先是添加的任何键:code set_new_dict = set(new_dict.keys())
猜你喜欢
  • 1970-01-01
  • 2016-01-04
  • 2016-09-29
  • 1970-01-01
  • 2015-01-04
  • 2021-04-05
  • 1970-01-01
  • 2018-04-13
  • 1970-01-01
相关资源
最近更新 更多