在更新键的值之前,我想测试字典中是否存在键。我写了以下代码:
1 2 3 4 | if 'key1' in dict.keys(): print"blah" else: print"boo" |
我认为这不是完成这项任务的最好方法。有没有更好的方法来测试字典中的键?
1 2 3 4 5 6 7 8 | d = dict() for i in xrange(100): key = i % 10 if key in d: d[key] += 1 else: d[key] = 1 |
如果你想要一个默认值,你可以使用
1 2 3 4 5 | d = dict() for i in xrange(100): key = i % 10 d[key] = d.get(key, 0) + 1 |
…如果你想确保任何键的默认值,你可以从
1 2 3 4 5 6 | from collections import defaultdict d = defaultdict(lambda: 0) for i in xrange(100): d[i % 10] += 1 |
…但是一般来说,
你不需要调用键:
1 2 3 4 | if 'key1' in dict: print"blah" else: print"boo" |
这将会快得多,因为它使用字典的哈希,而不是线性搜索,调用键就可以做到这一点。
您可以使用in关键字测试字典中是否存在键:
1 2 3 | d = {'a': 1, 'b': 2} 'a' in d # <== evaluates to True 'c' in d # <== evaluates to False |
检查关键的存在的一种常见用法在字典变异是default-initialize价值(例如,如果你的值列表,例如,和你想要确保有一个空列表,你可以添加时插入第一个值的键)。在这种情况下,您可能会发现
在较早的代码中,您可能还会发现
你可以把它缩短:
1 2 | if 'key1' in dict: ... |
然而,这充其量只是表面上的改善。为什么你认为这不是最好的方法?
我建议使用
1 2 3 4 5 6 7 8 9 10 11 | >>> d = {'foo':'bar'} >>> q = d.setdefault('foo','baz') #Do not override the existing key >>> print q #The value takes what was originally in the dictionary bar >>> print d {'foo': 'bar'} >>> r = d.setdefault('baz',18) #baz was never in the dictionary >>> print r #Now r has the value supplied above 18 >>> print d #The dictionary's been updated {'foo': 'bar', 'baz': 18} |
有关接受答案的建议方法(10m循环)的速度执行的额外信息:
因此,建议对
python中的Dictionary有一个get('key', default)方法。所以你可以设置一个默认值以防没有键。
1 2 | values = {...} myValue = values.get('Key', None) |
使用EAFP(请求原谅比请求许可更容易)怎么样?
1 2 3 4 5 | try: blah = dict["mykey"] # key exists in dict except KeyError: # key doesn't exist in dict |
参见其他SO帖子:
在python或中使用try vs if
检查Python中的成员是否存在
使用三元运算符:
1 2 | message ="blah" if 'key1' in dict else"booh" print(message) |
检查时可以使用
1 2 | if dict.has_key('key1'): print"it is there" |
如果您想要一个值,那么您可以使用
1 | a = dict.get('key1', expeced_type) |
如果您想要一个元组、列表、字典或任何字符串作为默认值作为返回值,那么使用
1 | a = dict.get('key1', {}).get('key2', []) |
你得到结果的方法是:
如果在python3中删除了your_dict.has_key(key)如果输入你的字典try /除了块哪一个更好取决于三件事:
字典是"通常有键"还是"通常没有键"。你打算使用if…else…else…else这样的条件吗?字典有多大?阅读更多:http://paltman.com/try-except-performance-in-python-a-simple-test/
用try/block代替in或if:
1 2 3 4 5 6 | try: my_dict_of_items[key_i_want_to_check] except KeyError: # Do the operation you wanted to do for"key not present in dict". else: # Do the operation you wanted to do with"key present in dict." |
您可以使用has_key()方法:
1 2 3 4 | if dict.has_key('xyz')==1: #update the value for the key else: pass |
或
1 2 3 4 5 6 7 | mydict = {"a": 5} print mydict["a"] #prints 5 print mydict["b"] #Throws KeyError: 'b' print mydict.get("a", 0) #prints 5 print mydict.get("b", 0) #prints 0 |
只是给克里斯补充一条信息。B(最佳答案):
1 | d = defaultdict(int) |
作品;原因是调用
不会为dict中的值打印boo,而是通过打印key1的值来确认它的存在,从而实现该目标。
Python dictionary有一个名为
1 2 3 4 5 6 7 8 | >>> temp = {} >>> help(temp.__contains__) Help on built-in function __contains__: __contains__(key, /) method of builtins.dict instance True if D has a key k, else False. |
要检查给定的键是否存在于字典中,您应该使用以下任何一种方法:
Approach One (working in Python 3):
1 2 3 4 5 6 | def checkKey(dict, key): if key in dict.keys(): print("Key is here,", end ="") print("value =", dict[key]) else: print("Key isn't present.") |
让我们检查一下:
1 2 3 4 5 6 7 | dict = {'r': 30, 'g':59, 'b':11} key = 'b' checkKey(dict, key) key = 'a' checkKey(dict, key) |
由于
1 2 | # Key is here, value = 11 # Key isn't present. |
Approach Two (working in Python 3):
1 2 3 4 5 6 | def checkKey(dict, key): if key in dict: print("Key is here,", end ="") print("value =", dict[key]) else: print("Key isn't present.") |
我们也来检查一下:
1 2 3 4 5 6 7 | dict = {'x': 10, 'y':20, 'z':30} key = 'y' checkKey(dict, key) key = 'u' checkKey(dict, key) |
由于
1 2 | # Key is here, value = 20 # Key isn't present. |
Approach Three (working in Python 3):
1 2 3 4 5 | def checkKey(dict, key): if dict.has_key(key): print"Key is here, value =", dict[key] else: print"Key isn't present." |
我们也来检查一下:
1 2 3 4 5 6 7 | dict = {'u': 0, 'v':1, 'w':2} key = 'u' checkKey(dict, key) key = 'm' checkKey(dict, key) |
由于
1 2 | # Key is here, value = 0 # Key isn't present. |
希望这个有帮助。
嗯. .您将熟悉在列表或数据中搜索元素的存在性意味着遍历所有内容(至少对于无序列表e)。g dict.keys)。因此,我们可以使用异常和通常出现的错误来避免这种复杂性……
1 2 3 4 5 6 | d={1:'a',2:'b'} try: needed=d[3] print(needed) except: print("Key doesnt exist") |
我用try/except;如果抛出异常,则在字典中不存在键。例子:
1 2 3 4 5 6 | st = 'sdhfjaks' d = {} try: print d['st'] except Exception, e: print 'Key not in the dictionary' |
最简单的一个是,如果你知道要查找哪个键(键名):
1 2 3 4 5 | # suppose your dictionary is my_dict = {'foo': 1, 'bar': 2} # check if a key is there if 'key' in my_dict.keys(): # it will evaluates to true if that key is present otherwise false. # do something |
或者你也可以这样做:
1 2 | if 'key' in my_dict: # it will evaluates to true if that key is present otherwise false. # do something |
你可以使用for循环进入字典的每个元素,得到你想要在字典中找到的名字,然后检查它是否存在:
1 2 3 4 5 6 | dic={‘first’ : 12, ‘second’ : 123} For each in dic : If each == ‘second’: Print (‘it is exist’) else : print (‘not exist’) |
为什么不直接使用has_key()方法呢?
1 2 3 4 5 | a = {} a.has_key('b') => #False a['b'] = 8 a.has_key('b') => #True |