KeyError, хотя ключ есть в словаре?Что я делаю неправильно? - PullRequest
0 голосов
/ 05 декабря 2018

Хорошо, я получаю ошибку ключа, и я сузил ее до этой функции здесь:

    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' in d
True

Так что я делаю неправильно??????

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Как уже отмечали другие, 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)
0 голосов
/ 05 декабря 2018

Когда вы используете 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)
...