2017-10-10 60 views
0

我想通过python3中的“try/catch”块检查O(1)时间字典中存在的元素。当我尝试这样做,我得到一个语法错误,我不知道为什么:Python 3.6.3 KeyError

try a_dict[i]: 
    print(i) 
except KeyError: 
    a_dict[i] = ... #some item 

为了简单起见,让我们说,我有一个检查阵列中的一个重复的功能,我有这个功能目前正使用的从上面的逻辑:

def hasDuplicate(a): 
    a_dict = dict() 
    for i in a: 
     # logic from above 
     try a_dict[i]: 
      print(i) 
     except KeyError: 
      a_dict[i] = True 
     # end of logic from above 
    return -1 

我会从try语句行上得到语法错误。

我想避免使用in,因为它检查O(N)时间。除非它在O(1)时间检查字典?任何帮助或反馈,将不胜感激

回答

1

的语法应为:

def hasDuplicate(a): 
    a_dict = dict() 
    for i in a: 
     # logic from above 
     try: 
      print(a_dict[i]) 
     except KeyError: 
      a_dict[i] = True 
     # end of logic from above 
    return -1 

从你提“的try/catch”我猜你是从Java来? :-)

+0

那么我会说“尝试/除外”,但那不是众所周知的。感谢您的帮助! –

+0

没问题!我认为try/except在python开发人员中非常有名。不知道'麻瓜'虽然! –

+0

我将此标记为答案,因为我的问题正确执行,但应该注意的是@Ignacio Vazquez-Abrams答案应该用于检查散列表 –

2

我想避免使用in,因为它检查O(N)时间。除非它在O(1)时间检查字典?

它的确如此。字典是一个专门的哈希映射,所以遏制检查是一个摊销O(1)。

+0

这很高兴知道,谢谢。应该注意的是,尽管我将前面的答案标记为正确,但在任何情况下都应该使用这个答案来检查散列表,因为''in'''实际上是O(1)for python dictionaries。 –

0

我想这就是你想要做的?如果你想查找重复,则不需要使用try/catch。

def hasDuplicate(a): 
    a_dict = dict() 
    for i in a: 
     # logic from above 
     try: 
     if a_dict[i]: 
      print(i) 
     except KeyError: 
     a_dict[i] = True 
     # end of logic from above 
    return -1 


print(hasDuplicate([1, 2, 3, 4, 1])) //print duplicate value (i.e. 1 and will return -1)