首页 > 解决方案 > 如果键值的值是单独列表的成员,则无法有效地从字典中提取键

问题描述

假设我有一个有序的字典:

import collections  
collections.OrderedDict([('great_key', {'keyword': {'blue', 'yellow'}}), ('super_key', {'keyword': {'lock', 'door'}})])

和一个列表potential_matches[red, red, blue, one]

我需要填充两个列表:
correct_key = []incorrect_match = []

如果潜在匹配是字典中某个键的关键字,则其键为 in correct_key,否则该词为 in incorrect_match

这个例子的结果应该是:
correct_key = [great_key],incorrect_match = [red, red, one]

这是我尝试过的:

correct = []  
incorrect = []  
for word in potential_matches:
    for key, value in ordered_dict.items():
        if word in value["keyword"] and word not in correct:
            correct.append(word)
        elif word not in value["keyword"] and word not in correct and word not in incorrect:
            incorrect.append(word)  

这不起作用,而且似乎也没有效率。

不能是一个集合 bc 它需要保留顺序,并且可以重复,以及列表中的多个项目。
它不应该在第一眼看到匹配就返回,因为匹配的 dict 的所有项目都应该在最终列表中。

本质上,所有剩余的不匹配的单词应该简单地转到另一个列表。

完成这项工作的最有效(和可读)的方法是什么?

注意:我之前问过类似的问题,尽管在这些情况下,情况和答案需要使用 python 集,因为项目是唯一的,或者是关键字而不是键。

标签: pythonpython-3.x

解决方案


基于运行您的代码,我相信没有匹配项。

>>> for key in f:
...   print(f[key])
... 
{'keywords': {'blue', 'yellow'}}
{'keywords': {'door', 'lock'}}

接着:

>>> for key in f:
...  v = f[key]
...  for b in v:
...   print(v[b])
... 
{'blue', 'yellow'}
{'door', 'lock'}
>>> for key in f:
...  for b in v:
...   for c in v[b]:
...    print(c)
... 
door
lock
door
lock

问题是您使用了两次关键字。keywords在第二次迭代中更改为keywords2


推荐阅读