即使键在字典中,也会发生KeyError吗?我究竟做错了什么?

时间:2018-12-04 23:16:40

标签: python dictionary keyerror

好吧,所以我遇到了一个关键错误,在这里我将其范围缩小到此功能:

    def find_coexistance(D, query):
        '''(dict,str)->list
        Description: outputs locations of words in a test based on query
        Precondition: D is a dictionary and query is a string
        '''
        query = query.split(" ")

        if (len(query) == 1):
            return D[str(query)]
        else:
            return D.intersection(query)
##############################
# main
##############################
file=open_file()
d=read_file(file)
query=input("Enter one or more words separated by spaces, or 'q' to quit:").strip().lower()
a = find_coexistance(d, query)
print (a)

这是我收到的以下输出:

Traceback (most recent call last):
File "C:\Users\hrith\Documents\ITI work\A5_300069290\a5_part1_300069290.py", 
line 135, in <module>
a = find_coexistance(d, query)
File "C:\Users\hrith\Documents\ITI work\A5_300069290\a5_part1_300069290.py", 
line 122, in find_coexistance
return D[str(query)]
KeyError: "['this']"

这是词典里面的内容:

d = {'this': {1, 2, 3, 4}, 'is': {1, 2, 3, 4}, 'man': {1, 2}, 'also': {2, 
    4}, 'woman': {3, 4}}

如果我检查字典中是否有“ this”,我将得到:

>>>'this' in d
True

那我在做什么错??????

2 个答案:

答案 0 :(得分:0)

在字符串上使用split()时,它总是返回一个列表。因此"foo bar".split(" ")给出了["foo", "bar" ]。但是"foo".split(" ")给出一个1元素列表["foo"]

该代码使用字符串列表作为字典索引,而不是纯字符串。

def find_coexistance(D, query):
    query = query.split(" ")

    if (len(query) == 1):
        return D[str(query)]   # <-- HERE
    else:
        return D.intersection(query)

这是一个简单的修复程序,采用拆分的第一个元素。

def find_coexistance(D, query):
    query = query.split(" ")

    if (len(query) == 1):
        return D[query[0]]   # <-- HERE
    else:
        return D.intersection(query)

答案 1 :(得分:0)

正如其他人指出的那样,query.split(" ")返回一个列表。使用str()将列表转换为单个字符串,并在其中包含方括号和引号之类的字符。

>>> q = "hello hi there"
>>> query = q.split()
>>> q
'hello hi there'
>>> query
['hello', 'hi', 'there']
>>> str(query) == "['hello', 'hi', 'there']"
True

无论如何,您最终要做什么?如果您尝试将字符串拆分成单词列表,请查找D中存在的所有单词,查看每个单词对应的数字集,最后返回所有这些集的交集,那么类似的方法应该起作用:

def find_coexistence(D, query):
    query = query.split(" ")
    sets_to_intersect = [ D[word] for word in query if word in D ]
    return set.intersection(*sets_to_intersect)