项目目标: 将输入与预先存在的索引进行比较,并以术语或字母频率返回最接近的匹配。 基本上所需的输出将在比较函数中使用如下索引:
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))
答案 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。
正如所建议的那样,尝试重新编写代码或使用集合中更好的数据结构。