Ошибка получения ключа при доступе к элементу словаря по ключу, а не по индексу - PullRequest
0 голосов
/ 10 октября 2018

Я написал следующую функцию для поиска пары в списке, сумма которой равна цели:

def twoSum(nums, target):
    hash={}
    for i in nums:
        if i in hash.keys():
            continue
        hash[i]=0
    print(hash)
    for i in range(len(nums)):
        temp=target-nums[i]
        if (hash[temp]==1):
            return (nums.index(temp),i)
        else:
            hash[nums[i]]=1
            print(hash)

Я передал nums = [3,2,3] и target = 6.При выполнении этого кода я получаю следующую ошибку:

{3: 0, 2: 0}
{3: 1, 2: 0}
Traceback (most recent call last):
File "xyz\#1_two_sum.py", line 18, in <module>
print(twoSum(nums,target))
File "xyz\#1_two_sum.py", line 10, in twoSum
if (hash[temp]==1):
KeyError: 4

Я хочу знать, где я делаю ошибку.

1 Ответ

0 голосов
/ 11 октября 2018

Для вашего кода:

def twoSum(nums, target):
    hash={}
    for i in nums:
        if i in hash.keys():
            continue
        hash[i]=0
    print(hash) # lineA
    for i in range(len(nums)): # lineB
        temp=target-nums[i]
        if (hash[temp]==1): # lineC
            return (nums.index(temp),i)
        else: # lineD
            hash[nums[i]]=1
            print(hash)

Он выполняется следующим образом:

  1. При lineA значение hash равно {3: 0, 2: 0}
  2. Тогдацикл начинается с lineB, первый цикл i is 0, поэтому temp равен 6-3, то есть 3, а hash[3] равен 0, не равен 1, поэтому переходите к lineD
  3. Начинайте цикл снова с lineB, второй цикл i is 1, поэтому temp равен 6-2, то есть 4, затем в lineC он выполняет if hash[4]==1), даетВы ошибаетесь:

if (hash [temp] == 1):

KeyError: 4

На самом деле я неЯ не совсем понимаю вашу логику, чтобы получить пару, посмотрите следующую функцию, которая может достичь ваших целей, просто для справки:

test.py:

def find_pair(nums, target):
    print(list(set([(v, target-v) for i, v in enumerate(nums) if target-v in nums[i+1:]])))

# some tests which different inputs
find_pair([3, 2, 3], 6)
find_pair([3, 2, 1], 6)
find_pair([3, 2, 4, 1, 5], 6)
find_pair([3, 2, 4, 1, 5, 3], 6)
find_pair([-1, 7, 5, 3], 6)

Просто выполните еезатем выводятся все пары:

[(3, 3)]

[]

[(1, 5), (2,4)]

[(1, 5), (3, 3), (2, 4)]

[(- 1, 7)]

...