我想在更新字典里的值之前测试一个键是否存在。我编写了以下代码:
if 'key1' in dict.keys():
print "blah"
else:
print "boo"
我认为这不是完成此任务的最佳方式。有更好的方法来测试字典中是否存在某个键吗?
我想在更新字典里的值之前测试一个键是否存在。我编写了以下代码:
if 'key1' in dict.keys():
print "blah"
else:
print "boo"
我认为这不是完成此任务的最佳方式。有更好的方法来测试字典中是否存在某个键吗?
d = {"key1": 10, "key2": 23}
if "key1" in d:
print("this will execute")
if "nonexistent key" in d:
print("this will not")
使用 dict.get()
在键不存在时提供默认值:
d = {}
for i in range(100):
key = i % 10
d[key] = d.get(key, 0) + 1
dict.setdefault()
:d = {}
for i in range(100):
d[i % 10] = d.setdefault(i % 10, 0) + 1
...或者更好的方法,使用collections
模块中的defaultdict
:
from collections import defaultdict
d = defaultdict(int)
for i in range(100):
d[i % 10] += 1
0
,那么使用get
是一个糟糕的测试。我通过困难的方式学到了这一点 :/ - Sebastien直接使用 key in my_dict
,而不是 key in my_dict.keys()
:
if 'key1' in my_dict:
print("blah")
else:
print("boo")
使用字典的O(1)哈希查找,要比对键列表进行O(n)线性搜索明显更快(更多详情)。
dict.keys()
(只是澄清一下) - Mattd = {'a': 1, 'b': 2}
'a' in d # <== evaluates to True
'c' in d # <== evaluates to False
在字典中对键进行变化之前常常需要检查该键是否存在,以便默认初始化值(例如,如果您的值是列表,并且想要确保在为键插入第一个值时有一个空列表可以添加)。在这种情况下,您可能会发现 collections.defaultdict()
类型很有用。
在旧代码中,您可能还会发现使用 has_key()
的一些用法,该方法已被弃用用于检查字典中的键是否存在(只需使用 key_name in dict_name
即可)。
你可以将代码缩短为以下内容:
if 'key1' in my_dict:
...
然而,这最多只是一个表面上的改进。你为什么认为这不是最好的方法?
.keys
在2.x中只生成一个列表或需要O(n)时间(和内存)。 在3.x中,它创建了一个特殊的视图对象,类似于2.x的.iterkeys
。 但是,它仍然增加了不必要的复杂性和开销。 - Karl Knechtel有关于答案被采纳者提出的方法(1000万次循环)的速度执行的额外信息:
'key' in mydict
执行时间1.07秒mydict.get('key')
执行时间1.84秒mydefaultdict['key']
执行时间1.07秒因此,使用 in
或 defaultdict
比使用get
更推荐。
get
的 1.84 秒 < 1.07*2 ;-P。 - Paul Rigor我建议使用setdefault
方法。听起来它会满足你的所有需求。
>>> 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}
setdefault
跟原帖的问题有什么关系? - hughdbrownPython中的字典有一个get('键', 默认值)
方法。所以你可以在没有键的情况下设置一个默认值。
values = {...}
myValue = values.get('Key', None)
get
方法的第二个参数是可选的,如果未包含则默认为None
,因此values.get('Key', None)
与values.get('Key')
相同。 - CodeBiker使用 EAFP (先请求宽恕,再寻求许可):
try:
blah = dict["mykey"]
# key exists in dict
except KeyError:
# key doesn't exist in dict
查看其他 Stack Overflow 帖子:
检查字典中是否存在给定的键。
为了想出如何做到这一点,我们首先检查可以在字典上调用哪些方法。
以下是可用的方法:
d={'clear':0, 'copy':1, 'fromkeys':2, 'get':3, 'items':4, 'keys':5, 'pop':6, 'popitem':7, 'setdefault':8, 'update':9, 'values':10}
Python Dictionary clear() Removes all Items
Python Dictionary copy() Returns Shallow Copy of a Dictionary
Python Dictionary fromkeys() Creates dictionary from given sequence
Python Dictionary get() Returns Value of The Key
Python Dictionary items() Returns view of dictionary (key, value) pair
Python Dictionary keys() Returns View Object of All Keys
Python Dictionary pop() Removes and returns element having given key
Python Dictionary popitem() Returns & Removes Element From Dictionary
Python Dictionary setdefault() Inserts Key With a Value if Key is not Present
Python Dictionary update() Updates the Dictionary
Python Dictionary values() Returns view of all values in dictionary
检查键是否已存在的残酷方法可能是使用 get()
方法:
d.get("key")
另外两种有趣的方法items()和keys()听起来需要做很多工作。所以让我们检查一下get()
是否是适合我们的正确方法。我们有一个字典d
:
d= {'clear':0, 'copy':1, 'fromkeys':2, 'get':3, 'items':4, 'keys':5, 'pop':6, 'popitem':7, 'setdefault':8, 'update':9, 'values':10}
打印一个不存在的键,将返回None
:
print(d.get('key')) #None
print(d.get('clear')) #0
print(d.get('copy')) #1
我们使用它来获取键是否存在的信息。但是请考虑如果我们创建一个只有一个key: None
的字典:
d= {'key':None}
print(d.get('key')) #None
print(d.get('key2')) #None
在某些值可能为 None
的情况下,使用 get()
方法不可靠。
这个故事应该有一个更加美好的结局。如果我们使用 in
比较符:
print('key' in d) #True
print('key2' in d) #False
我们得到了正确的结果。
我们可以检查Python字节码:
import dis
dis.dis("'key' in d")
# 1 0 LOAD_CONST 0 ('key')
# 2 LOAD_NAME 0 (d)
# 4 COMPARE_OP 6 (in)
# 6 RETURN_VALUE
dis.dis("d.get('key2')")
# 1 0 LOAD_NAME 0 (d)
# 2 LOAD_METHOD 1 (get)
# 4 LOAD_CONST 0 ('key2')
# 6 CALL_METHOD 1
# 8 RETURN_VALUE
这表明in
比较运算符不仅更可靠,而且速度比get()
还要快。
.get()
can have a second argument for default
value, that couldbe used to handle the issue where key:None
. example: d.get("key", False)
- Alex.get()
是最快的方法。
另一个选项是在 try
/except
块中进行赋值。 - HCLivess
dict.keys()
会创建一个键列表,根据文档http://docs.python.org/2/library/stdtypes.html#dict.keys的说明。但是如果在实际的实现中没有对这种模式进行优化以转换为`if 'key1' in dict:`,那么我会感到惊讶。 - Evgeni Sergeevx in dict.keys()
来检查键。这是因为在Java中迭代键的通常方式是for (Type k:dict.keySet())
,养成了这个习惯,导致for k in dict.keys()
比for k in dict
(在性能方面仍然可以)更加自然,但是检查键也变成了if k in dict.keys()
,这是一个问题... - Evgeni Sergeevif k in dict_:
判断 k 是否在字典 dict_ 的键中,所以你仍然不需要使用dict_.keys()
。(这个问题曾经让我误解,因为它听起来像是在测试字典中的值是否存在。但实际上不是这样。) - ToolmakerSteve