繁体   English   中英

如果键值的值是单独列表的成员,则无法有效地从字典中提取键

[英]Having trouble efficiently extracting key from a dict if key value's value is member of separate list

假设我下达命令:

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

potential_matches列表: [red, red, blue, one]

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

如果潜在的比赛是在字典的关键之一的关键字,则其关键进去correct_key ,否则的话进去incorrect_match

该示例的结果应为:
correct_key = [great_key]incorrect_match = [red, red, one] 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集,因为项目是唯一的,或者是关键字而不是键。

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

>>> 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM