如何查找两个嵌套字典中的键是否匹配?

时间:2017-02-23 11:07:21

标签: python dictionary iteration

项目目标: 将输入与预先存在的索引进行比较,并以术语或字母频率返回最接近的匹配。 基本上所需的输出将在比较函数中使用如下索引:

 index = {'nino': {'n': '0.50', 'o': '0.25', 'i': '0.25'}, 
         'pablo': {'l': '0.20', 'p': '0.20', 'o': '0.20', 'b': '0.20', 'a': '0.20'}}

并将其与输入字符串进行比较,我将从中计算字母频率以及返回类似输出,字母频率:

{'y': '0.20', 'k': '0.20', 'o': '0.20', 'c': '0.20', 'r': '0.20'}

有了这个,我会遍历这两个词典并检查每个项目的字母是什么。 一旦它们存在,我将比较单词和属性点中的频率,然后比较结果并返回得分最多的那个。 我对代码的结尾没有任何麻烦。 然而,我似乎无法做到的是两个字典及其嵌套元素之间的迭代(该值毕竟是一个字典: 我已经尝试了两套方法,然后得到两个集合的联合,但后来我无法进入下一部分:它说集合是不可变的。

然后我尝试调整我在这里找到的答案中的代码: python dictionary match key values in two dictionaries 然后我从上面的答案中尝试了这个选项:

if all(string_index[k] == v for k, v in index.items() if k in index):

然后我得到了一个关键错误,摇滚(第一个键),它告诉我某个地方没有迭代并比较我想要比较的内容。

然后我陷入了迭代部分。 一旦我做对了,我知道我可以完成它。 非常感谢任何暗示或提示!

index={}
#Get frequency of a letter

def frequency_return(string,letter):
    count=0

    for letters in string:
       if letters==letter:
           count+=1
    return count

#Scan all letters: if a letter has not been searched then count
def get_frequency(string):
  range_string=string
  length_string=len(string)
  datastore={}
  target=0
  frequency=0
  while len(range_string)!=0:
           # datastore.append(range_string[target])
            frequency = (int(frequency_return(range_string,range_string[target]))/length_string)
            frequency = format(frequency, '.2f')
            datastore.update({range_string[target]:frequency})
            range_string = range_string.replace(range_string[target],'')
  return datastore          

def index_string(string):

    if string not in index:

      index.update({string: (get_frequency(string))})
    return index

index_string("pablo")
index_string("rocky")
index_string("rigo")
index_string("nino")

print (index)

###############################################################################################


def comparator (string, index):
  string_index=get_frequency(string)
  result={}
  if all(string_index[k] == v for k, v in index.items() if k in index):
    result.update(string_index)
  return result

print(comparator("baobab", index))

1 个答案:

答案 0 :(得分:2)

我认为你误导了你正在迭代的东西。由于某种原因你有KeyError异常 - 在这一行:

if all(string_index[k] == v for k, v in index.items() if k in index):

在for循环中,你没有迭代'rigo'或'pablo'字典的键。相反,你在字典上进行迭代,其中包含密钥:'rigo', 'nino', 'rocky', 'pablo'(在该代码中为k)和值{'a': '0.20', 'p': '0.20', 'b': '0.20', 'l': '0.20', 'o': '0.20'}{'i': '0.25', 'r': '0.25', 'g': '0.25', 'o': '0.25'}等。

你可以试试这个小片段:

>>> for k,v in index.items():
...     print("key is:{}, value is:{}".format(k,v))
... 
"key is:pablo, value is:{'a': '0.20', 'p': '0.20', 'b': '0.20', 'l': '0.20', 'o': '0.20'}"
"key is:rigo, value is:{'i': '0.25', 'r': '0.25', 'g': '0.25', 'o': '0.25'}"
"key is:nino, value is:{'i': '0.25', 'o': '0.25', 'n': '0.50'}"
"key is:rocky, value is:{'y': '0.20', 'c': '0.20', 'r': '0.20', 'k': '0.20', 'o': '0.20'}"

更重要的是,这个if没有多大意义,就像你在index.items()上迭代一样,k总是在索引中。

最后,因为k是值'rigo','rocky','pablo','nino'之一,这部分:

string_index[k] == v

...正在尝试评估关键字'rigo'上的string_index,它不是string_index.keys()的元素,因此程序返回Exception。

正如所建议的那样,尝试重新编写代码或使用集合中更好的数据结构。