Оператор Timing del для словарей, KeyError?

Я работаю над заданием Python для класса, который я беру, и я просто не могу понять, как пройти мимо этой ошибки KeyError. Я пытаюсь использовать оператор del для словарей в python, вот мой код:

from timeit import Timer


def build_dict(n): # build dict = { 0:"0", 1:"1", 2:"2", ... n:"n" }
    return {i : str(i) for i in range(n)}  

def dictionaryx(x,n):
    del x[0]
    del x[n//2]
    del x[n-1]

timeDict = Timer(
    "dictionaryx(x,n)",
    "from __main__ import n,build_dict,dictionaryx; x = build_dict(n)")


for size in range(1000, 100000+1, 5000):
    n = size
    dict_secs = timeDict.repeat(5,5)
    print(n, "\t", min(dict_secs))

Каждый раз, когда я пытаюсь запустить этот код, я получаю следующую ошибку

Трассировка (последний последний вызов): файл «/Users/mcastro/PycharmProjects/untitled1/testdel.py», строка 21, в dict_secs = timeDict.repeat(5,5) File «/Library/Frameworks/Python.framework/Versions /3.5/lib/python3.5/timeit.py", строка 206, повторяется t = self.timeit(number) File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/timeit. py", строка 178, в timeit time = self.inner(it, self.timer) File "", строка 6, во внутреннем файле "/Users/mcastro/PycharmProjects/untitled1/testdel.py", строка 10, в словареx дель х [0] KeyError: 0

Я не могу понять, почему я получаю эту ошибку или как ее исправить, насколько я понимаю, ключи, на которые ссылаются ошибки, присутствуют, но не могут быть удалены? Любая помощь приветствуется


person Miguel Castorena    schedule 16.10.2015    source источник


Ответы (1)


Ваш цикл timeit каждый раз использует один и тот же словарь x. При первом вызове dictionaryx(x,n) он удаляет элемент 0, поэтому при следующем вызове его не будет.

def build_dict(n): # build dict = { 0:"0", 1:"1", 2:"2", ... n:"n" }
    return {i : str(i) for i in range(n)}

def dictionaryx(x,n):
    del x[0]
    del x[n//2]
    del x[n-1]

n = 1000
x = build_dict(n)
dictionaryx(x,n)    # this deletes x[0]
dictionaryx(x,n)    # this causes the error
person Brent Washburne    schedule 16.10.2015