dict.pop()报告异常的keyerror

时间:2019-03-20 11:15:16

标签: python python-3.x

我试图解决leetcode中的twoSum问题 Two Sum - LeetCode

  

给出一个整数数组,返回两个数字的指数,以便它们加起来成为一个特定的目标。

     

您可以假设每个输入将具有恰好一种解决方案,并且您可能不会两次使用 same 元素。

     

示例:

Given nums = [2, 7, 11, 15], target = 9,

Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].

我的解决方案:
1.确定第一个数字,然后搜索(目标-first)
2.使用哈希表查找索引

class Solution():
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        # nums_d: {value:index} 
        nums_d = {nums[i]:i for i in range(len(nums))}
        for i in range(len(nums)):
            find = target - nums[i]
            print('find: ', find)
            nums_d.pop(nums[i]) #Avoid use an element twice
            j = nums_d.get(find)#hash table to search 
            print('j: ',j)
            if j: 
                return [i, j]
        return None  

和测试代码

target = random.randrange(200,300)
nums = list(range(150))
nums = random.choices(nums, k=100)
solution = Solution()
print(solution.twoSum(nums, target))

运行时报告KeyError

In [131]: !python twoSum.py                                                                                                   
find:  168
j:  None
find:  183
j:  None
find:  216
j:  None
find:  163
j:  None
find:  182
j:  None
find:  169
j:  None
find:  235
j:  None
find:  169
Traceback (most recent call last):
  File "twoSum.py", line 67, in <module>
    print(solution.twoSum(nums, target))
  File "twoSum.py", line 57, in twoSum
    nums_d.pop(nums[i]) #Avoid use an element twice
KeyError: 122

我找不到第nums_d.pop(nums[i])行的问题

1 个答案:

答案 0 :(得分:3)

您的字典大小随着pop的减小而减小,而i则增加到列表的(原始)长度,在某些时候,您将引用一个比列表大的键,得到KeyError

您想要的东西是这样的:

for i, k in enumerate(nums_d.keys()):
    # code stuff

这样,您将i作为要在nums中执行索引的范围,并且您拥有k引用了nums_d中的每个键,以便使用pop,并避免两次使用元素。