Python 如果键值';s值是单独列表的成员
假设我有一个有序的口述:Python 如果键值';s值是单独列表的成员,python,python-3.x,Python,Python 3.x,假设我有一个有序的口述: import collections collections.OrderedDict([('great_key', {'keyword': {'blue', 'yellow'}}), ('super_key', {'keyword': {'lock', 'door'}})]) 和一个潜在匹配项列表:[红,红,蓝,一] 我需要填充两个列表: correct\u key=[]或不正确的匹配=[] 如果潜在匹配项是dict中某个键的关键字,则其键进入correct\u
import collections
collections.OrderedDict([('great_key', {'keyword': {'blue', 'yellow'}}), ('super_key', {'keyword': {'lock', 'door'}})])
和一个潜在匹配项列表:[红,红,蓝,一]
我需要填充两个列表:correct\u key=[]
或不正确的匹配=[]
如果潜在匹配项是dict中某个键的关键字,则其键进入
correct\u key
,否则该词进入correct\u match
此示例的结果应为:correct\u key=[great\u key]
,不正确的匹配=[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)
这不起作用,而且似乎也没有效率
它不能是一个集合,因为它需要保持顺序,重复项和列表中的多个项都可以。它不应该在第一眼看到匹配时返回,因为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
问题是您使用了两次关键字。将第二次迭代中的
关键字
更改为关键字2
“如果潜在匹配项是dict中某个关键字的关键字”令人困惑。。@T.Woody我同意。但我相信这和我想表达的是相当准确的。如果潜在匹配
中的项恰好是dict中某个键的关键字
中的值。。。这会更好吗?我认为这个例子的答案很好地说明了预期的结果。我已经测试了一些东西,它可能是你想要的,但我想先弄清楚一些东西重复项和列表中的多个项都可以。那么这是否意味着代码可以在不正确的匹配列表中有重复的匹配项?例如:['red','one','red','one']@josephseungjaedolar这些条件只是在重复python列表的常见特性。想要明确重复项是可以的,并且在整个oDict中迭代,以避免第一眼看到匹配项就返回。@Casper是的,因为对于f
中的每个元素,您可以将其与潜在匹配项中的每个元素进行比较。也就是说,f
中的n
元素和potential\u中的n
元素是匹配的
。您的答案不会将匹配的键排序到一个列表中,而将不匹配的键排序到另一个列表中。@Casper我可以为您编写特定的代码。。。但是我觉得我已经非常准确地指出了两次使用关键字的主要问题。我不确定我是否遵守了keyword
是该特定词典中键的实际名称。不可能changed@Casper如果您需要进一步的帮助,我很乐意通过电子邮件聊天帮助您:Tanner.L。Woody@gmail.com