检查给定键是否已存在于字典中

问:

这个问题的答案是社区的努力。编辑现有答案以改进这篇文章。它目前不接受新的答案或交互。

我想在更新键的值之前测试一个键是否存在于字典中。我写了以下代码:

if 'key1' in dict.keys():
  print "blah"
else:
  print "boo"

我认为这不是完成这项任务的最佳方式。有没有更好的方法来测试字典中的键?

答1:

一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会

in 测试 dict 中是否存在键:

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(10):
    d[i] = d.get(i, 0) + 1

要为 每个 键提供默认值,请在每个分配上使用 dict.setdefault():

d = {}

for i in range(10):
    d[i] = d.setdefault(i, 0) + 1

或使用 collections 模块中的 defaultdict:

from collections import defaultdict

d = defaultdict(int)

for i in range(10):
    d[i] += 1

如果无论如何我要从字典中提取项目,我通常只使用 get。使用 in and 将项目从字典中拉出是没有意义的。

我完全同意。但是,如果您只需要知道某个键是否存在,或者您需要区分定义键的情况和使用默认键的情况,in 是最好的方法。

@enkash 提供了 Python 3 的参考。这里是 Python 2.7 的参考:dict 和 dict.get。

如果键等于“False”,例如 0,则 get 是一个不好的测试。很难学到这一点:/

我不能同意这是一个完整的答案,因为它没有提到当密钥失败的数量足够小时时,'try'-'except' 将是最快的。请参阅下面的答案:stackoverflow.com/a/1602945/4376643

答2:

huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!

您不必调用密钥:

if 'key1' in dict:
  print("blah")
else:
  print("boo")

这将是很多 faster,因为它使用字典的散列而不是进行线性搜索,调用键会这样做。

不适用于嵌套值。

答3:

huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!

您可以使用 in 关键字测试字典中是否存在键:

d = {'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)。

答4:

huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求

您可以将代码缩短为:

if 'key1' in my_dict:
    ...

然而,这充其量只是外观上的改进。为什么你认为这不是最好的方法?

这不仅仅是外观上的改进。使用这种方法找到一个键的时间是 O(1),而调用键会生成一个列表并且是 O(n)。

O(1) 似乎不太正确。你确定这不是 O(log n) 之类的东西吗?

这是单个 dict 查找的复杂性,平均为 O(1),最坏的情况为 O(n)。 .list() 将始终为 O(n)。 wiki.python.org/moin/TimeComplexity

这也避免了额外的分配。 (对于使紧密循环更快一点很重要)

答5:

HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com

有关 accepted answer’s 建议方法(10 M 循环)的速度执行的更多信息:

mydict 中的“key”经过时间 1.07 秒

mydict.get(‘key’) 经过时间 1.84 秒

mydefaultdict[‘key’] 经过时间 1.07 秒

因此,建议对 get 使用 in 或 defaultdict。

完全同意 get 的 1.84s 是 < 1.07*2 ;-P

答6:

与HuntsBot一起,探索全球自由职业机会–huntsbot.com

我建议改用 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 与 OP 的问题有什么关系?

@hughdbrown“我想在更新键的值之前测试字典中是否存在键。”有时,帖子包含的代码会产生一系列对不完全是最初目标的东西的响应。为了实现第一句中所述的目标,setdefault 是最有效的方法,即使它不是发布的示例代码的直接替代品。

答7:

一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会

Python 中的字典有一个 get(‘key’, default) 方法。所以你可以设置一个默认值,以防没有任何键。

values = {...}
myValue = values.get('Key', None)

huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。

get 方法的第二个参数是可选的,如果不包含则默认为 None,因此 values.get('Key', None) 与 values.get('Key') 相同。

答8:

huntsbot.com – 高效赚钱,自由工作

使用 Python ternary operator:

message = "blah" if 'key1' in my_dict else "booh"
print(message)

huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式

答9:

打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!

使用 EAFP(请求宽恕比请求许可更容易):

try:
   blah = dict["mykey"]
   # key exists in dict
except KeyError:
   # key doesn't exist in dict

查看其他堆栈溢出帖子:

在 Python 中使用“try”与“if”

在 Python 中检查成员是否存在

如果密钥可能经常不存在,那么 Try/except 可能会更昂贵。从您引用的帖子中:“[I]如果您希望 99 % 的时间结果实际上包含可迭代的东西,我会使用 try/except 方法。如果异常确实是异常的,它会更快。如果结果是 None超过 50% 的时间,那么使用 if 可能会更好。[...][A]n if 语句总是要花费你,设置 try/except 块几乎是免费的。但是当实际发生异常时,成本要高得多。” stackoverflow.com/a/1835844/1094092

答10:

一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会

检查给定键是否已存在于字典中

为了了解如何做到这一点,我们首先检查我们可以在字典上调用哪些方法。

以下是方法:

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() 更快。

一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会

.get() 可以为 default 值提供第二个参数,可用于处理 key:None 的问题。示例:d.get("key", False)

.get() 是最快的方法。另一种选择是在 try/except 块中分配

答11:

huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式

获得结果的方法有:

if your_dict.has_key(key) 在 Python 3 中被移除

如果键入 your_dict

尝试/排除块

哪个更好取决于三件事:

字典是“通常有钥匙”还是“通常没有钥匙”。您是否打算使用 if…else…elseif…else 之类的条件?字典有多大?

阅读更多:http://paltman.com/try-except-performance-in-python-a-simple-test/

使用 try/block 代替 ‘in’ 或 ‘if’:

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."

原文链接:https://www.huntsbot.com/qa/8KPV/check-if-a-given-key-already-exists-in-a-dictionary?lang=zh_CN&from=csdn

huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值