如何从 Python 字典中删除键?

这篇具有很好参考价值的文章主要介绍了如何从 Python 字典中删除键?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问:

是否有一种在不引发 KeyError 的情况下从字典中删除键的单行方法?

if 'key' in my_dict:
    del my_dict['key']

答1:

huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。

要删除某个键(无论它是否在字典中),请使用 dict.pop() 的两个参数形式:

my_dict.pop('key', None)

如果字典中存在 key,则返回 my_dict[key],否则返回 None。如果未指定第二个参数(即 my_dict.pop(‘key’))且 key 不存在,则引发 KeyError。

要删除保证存在的键,您还可以使用:

del my_dict['key']

如果键不在字典中,这将引发 KeyError。

有时使用 pop() 而不是 del 的优势:它返回该键的值。这样,您可以在一行代码中从字典中获取和删除条目。

在问题中,不需要保留该值。这只会增加不必要的复杂性。 @zigg(下)的答案要好得多。

@SalvatoreCosentino 我无法理解你的论点。这个答案中的代码比另一个答案中的代码复杂吗?

@SalvatoreCosentino 不,忽略函数的返回值一点也不低效。恰恰相反 - 如果密钥不存在,此解决方案比 try/except 解决方案快得多。您可能会发现其中一个或另一个更易于阅读,这很好。两者都是惯用的 Python,因此请选择您喜欢的任何内容。但是声称这个答案更复杂或更低效是没有意义的。

@user5359531 我不明白。这是怎么回事? Python 内置类型的所有方法都没有返回 self,所以如果这个方法返回,那就太令人惊讶了。

答2:

huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感

具体回答“有没有一种方法可以做到这一点?”

if 'key' in my_dict: del my_dict['key']

…好吧,你问了;-)

不过,您应该考虑,这种从 dict 中删除对象的方式是 not atomic — ‘key’ 可能在 if 语句期间位于 my_dict 中,但可能在 del 之前被删除} 被执行,在这种情况下 del 将失败并返回 KeyError。鉴于此,使用 use dict.pop 或类似的东西是最安全的

try:
    del my_dict['key']
except KeyError:
    pass

当然,这绝对不是单行的。

是的,pop 绝对更简洁,尽管这样做有一个关键优势:立即清楚它在做什么。

try/except 语句更昂贵。引发异常很慢。

@ChrisBarker 我发现如果密钥存在,try 会稍微快一些,但如果不存在,try 确实会慢很多。 pop 相当一致,但比使用不存在键的 try 慢。请参阅gist.github.com/zigg/6280653。最终,这取决于您期望密钥实际出现在字典中的频率,以及您是否需要原子性——当然,还取决于您是否进行过早优化;)

我认为不应该忽视清晰的价值。为此+1。

关于 try/except 的费用,您也可以使用 if 'key' in mydict: #then del...。我需要从字典中提取一个键/值来正确解析,pop 不是一个完美的解决方案。

答3:

huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。

我花了一些时间才弄清楚 my_dict.pop(“key”, None) 到底在做什么。因此,我将添加此作为答案以节省其他人的谷歌搜索时间:

pop(key[, default]) 如果 key 在字典中,删除它并返回它的值,否则返回默认值。如果未给出默认值且 key 不在字典中,则会引发 KeyError。

Documentation

只需在 python 解释器中输入 help(dict.pop)。

help() 和 dir() 当你需要知道某事做什么时,可以成为你的朋友。

或 IPython 中的 dict.pop?。

答4:

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

del my_dict[key] 比 my_dict.pop(key) 在键存在时从字典中删除键稍快

>>> import timeit
>>> setup = "d = {i: i for i in range(100000)}"

>>> timeit.timeit("del d[3]", setup=setup, number=1)
1.79e-06
>>> timeit.timeit("d.pop(3)", setup=setup, number=1)
2.09e-06
>>> timeit.timeit("d2 = {key: val for key, val in d.items() if key != 3}", setup=setup, number=1)
0.00786

但是当密钥不存在时,if key in my_dict: del my_dict[key] 比 my_dict.pop(key, None) 稍快。在 try/except 语句中,两者都至少比 del 快三倍:

>>> timeit.timeit("if 'missing key' in d: del d['missing key']", setup=setup)
0.0229
>>> timeit.timeit("d.pop('missing key', None)", setup=setup)
0.0426
>>> try_except = """
... try:
...     del d['missing key']
... except KeyError:
...     pass
... """
>>> timeit.timeit(try_except, setup=setup)
0.133

@Boris - 这对于一般练习很有用。

@daisy 我的意思是,您应该选择最易读的语法,而不是快 300 纳秒的操作(这实际上是上面第一组时序中 del 和 pop 之间的区别)

这些操作也非常快,以至于这些时间不可靠。

答5:

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

如果您需要在一行代码中从字典中删除很多键,我认为使用 map() 非常简洁且 Python 可读:

myDict = {'a':1,'b':2,'c':3,'d':4}
map(myDict.pop, ['a','c']) # The list of keys to remove
>>> myDict
{'b': 2, 'd': 4}

如果您需要捕获弹出不在字典中的值的错误,请在 map() 中使用 lambda,如下所示:

map(lambda x: myDict.pop(x,None), ['a', 'c', 'e'])
[1, 3, None] # pop returns
>>> myDict
{'b': 2, 'd': 4}

或在 python3 中,您必须改用列表推导:

[myDict.pop(x, None) for x in ['a', 'c', 'e']]

有用。即使 myDict 没有“e”键,“e”也不会导致错误。

这在 Python 3 中不起作用,因为 map 和朋友现在很懒惰并返回迭代器。将 map 用于副作用通常被认为是不好的做法;标准的 for ... in 循环会更好。有关详细信息,请参阅 Views And Iterators Instead Of Lists。

无论品味和实践风格如何,列表推导在 Py3 [myDict.pop(i, None) for i in ['a', 'c']] 中仍然可以工作,因为它们提供了 map(和 filter)的一般替代方案。

@MichaelEkoka 你不应该使用列表推导来解决它们的副作用,使用常规的 for ... in 循环。

@Boris 你可能是对的。我的回答特别与使用 map() 相关,因为它的副作用经常被使用。 Python 中推荐的替代方法是 列表推导式,在我看来,它仍然是非常易读的,并且作为单行代码在认知上很轻(参见问题)。仅用于它们的副作用,这两种结构确实会导致一个无用的列表,这可能是低效的。从 Python3 开始,我不知道有一个内置函数可以安全、优雅地遍历生成器表达式,而没有代价高昂的副产品,例如 loop(d.pop(k) for k in ['a', 'b'])。

@MichaelEkoka “内置函数”是一个 for 循环:for k in ['a', 'b']: d.pop(k)。为什么你需要一种不同的方式来做到这一点?如果您需要它只占用一行那么严重,那么您可以将 for 循环的第二部分放在同一行上。

答6:

huntsbot.com精选全球7大洲远程工作机会,涵盖各领域,帮助想要远程工作的数字游民们能更精准、更高效的找到对方。

您可以使用 dictionary comprehension 创建一个删除该键的新字典:

>>> my_dict = {k: v for k, v in my_dict.items() if k != 'key'}

可以按条件删除。如果 key 不存在,则不会出错。

这个答案与其他答案不同,因为它没有副作用(它不会改变原始字典)。

虽然这可能也是我会这样做的方式,但这会在内存中创建一个全新的字典,将对象复制(引用)到新字典。然后将其保存为旧名称。对于大型词典,这可能需要一些时间。 del dict[key] 或 dict.pop(key) 在所有情况下都会更快。

del 和 pop 更快,但有时您只是不想修改原始字典。如果在上面的示例中,将理解结果分配给另一个变量会更有意义。

答7:

huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。

使用“del”关键字:

del dict[key]

答8:

huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感

我们可以通过以下一些方法从 Python 字典中删除一个键。

使用 del 关键字;这与您所做的几乎相同 -

 myDict = {'one': 100, 'two': 200, 'three': 300 }
 print(myDict)  # {'one': 100, 'two': 200, 'three': 300}
 if myDict.get('one') : del myDict['one']
 print(myDict)  # {'two': 200, 'three': 300}

或者

我们可以这样做:

但请记住,在此过程中,实际上它不会删除字典中的任何键,而是从该字典中排除特定键。此外,我观察到它返回的字典与 myDict 的排序不同。

myDict = {'one': 100, 'two': 200, 'three': 300, 'four': 400, 'five': 500}
{key:value for key, value in myDict.items() if key != 'one'}

如果我们在 shell 中运行它,它会执行类似 {‘five’: 500, ‘four’: 400, ‘three’: 300, ‘two’: 200} 的操作 - 请注意它与 myDict 的顺序不同。同样,如果我们尝试打印 myDict,那么我们可以看到所有键,包括我们通过这种方法从字典中排除的键。但是,我们可以通过将以下语句分配给变量来创建一个新字典:

var = {key:value for key, value in myDict.items() if key != 'one'}

现在,如果我们尝试打印它,那么它将遵循父顺序:

print(var) # {'two': 200, 'three': 300, 'four': 400, 'five': 500}

或者

使用 pop() 方法。

myDict = {'one': 100, 'two': 200, 'three': 300}
print(myDict)

if myDict.get('one') : myDict.pop('one')
print(myDict)  # {'two': 200, 'three': 300}

del 和 pop 的区别在于,使用 pop() 方法,如果需要,我们实际上可以存储 键的值,如下所示:

myDict = {'one': 100, 'two': 200, 'three': 300}
if myDict.get('one') : var = myDict.pop('one')
print(myDict) # {'two': 200, 'three': 300}
print(var)    # 100

Fork this gist 以供将来参考,如果您觉得这很有用。

huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。

不要使用 if myDict.get('one') 检查密钥是否存在!如果 myDict['one'] 有一个错误的值,它会失败。此外,dicts 没有固有的顺序,因此提及它是没有意义的。

@Rob 字典按从 CPython 3.6 开始的插入顺序和从 3.7 开始的所有其他 Python 实现进行排序。

答9:

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

如果您想非常详细,可以使用异常处理:

try: 
    del dict[key]

except KeyError: pass

但是,如果密钥不存在,这将比 pop() 方法慢。

my_dict.pop('key', None)

几个键无关紧要,但如果你反复这样做,那么后一种方法是更好的选择。

最快的方法是这样的:

if 'key' in dict: 
    del myDict['key']

但是这种方法很危险,因为如果在两行之间删除 ‘key’,则会引发 KeyError。

答10:

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

字典 数据类型有一个名为 dict_name.pop(item) 的方法,可用于从字典中删除 key:value 对。

a={9:4,2:3,4:2,1:3}
a.pop(9)
print(a)

这将使输出为:

{2: 3, 4: 2, 1: 3}

这样,您可以在一行中从字典中删除一个项目。

答11:

保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com

另一种方法是使用 items() + dict理解。

items() 与dict理解相结合也可以帮助我们完成键值对删除的任务,但它的缺点是不是一个到位的dict技术。实际上,如果创建了一个新的字典,除了我们不希望包含的键。

test_dict = {"sai" : 22, "kiran" : 21, "vinod" : 21, "sangam" : 21}

# Printing dictionary before removal
print ("dictionary before performing remove is : " + str(test_dict))

# Using items() + dict comprehension to remove a dict. pair
# removes  vinod
new_dict = {key:val for key, val in test_dict.items() if key != 'vinod'}

# Printing dictionary after removal
print ("dictionary after remove is : " + str(new_dict))

输出:

dictionary before performing remove is : {'sai': 22, 'kiran': 21, 'vinod': 21, 'sangam': 21}
dictionary after remove is : {'sai': 22, 'kiran': 21, 'sangam': 21}

这实际上并没有做所要求的 - 它创建一个新的字典,删除了不需要的键。此外,遍历所有键以删除一个键是在 O(N) 时间内执行 O(1) 操作。

原文链接:https://www.huntsbot.com/qa/JAnJ/how-can-i-remove-a-key-from-a-python-dictionary?lang=zh_CN&from=csdn

huntsbot.com – 程序员副业首选,一站式外包任务、远程工作、创意产品分享订阅平台。文章来源地址https://www.toymoban.com/news/detail-413492.html

到了这里,关于如何从 Python 字典中删除键?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python dict字典基本操作(包括添加、修改、删除键值对)

    由于字典属于可变序列,所以我们可以任意操作字典中的键值对(key-value)。Python 中,常见的字典操作有以下几种: 向现有字典中添加新的键值对。 修改现有字典中的键值对。 从现有字典中删除指定的键值对。 判断现有字典中是否存在指定的键值对。 初学者要牢记,字典

    2024年02月08日
    浏览(57)
  • 爬虫012_字典高级操作_查询_修改_添加_删除和清空_遍历---python工作笔记031

    然后来看字典高级,首先 打印某个元素     然后打印的时候注意,如果直接打印的值,在字典中没有就报错     这里要注意不能用点访问  

    2024年02月13日
    浏览(37)
  • 由面试题“Redis是否为单线程”引发的思考

    博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客👦🏻 《java 面试题大全》 《java 专栏》 🍩惟余辈才疏学浅,临摹之作或有不妥之处,还请读者海涵指正。☕🍭 《MYSQL从入门到精通》数据库是开发者必会基础之一~ 🪁 吾期望此文有资助于尔,即使粗浅难及深广,亦

    2024年04月16日
    浏览(37)
  • 解决python keyerror(0)

    目录 解决Python KeyError(0) 错误 错误原因 解决方法 1. 检查字典中的键 2. 使用get()方法 3. 使用try-except语句 总结 示例代码 字典的特点 创建字典 1. 使用花括号{}和冒号:来定义键值对 2. 使用内置的​​dict()​​函数 字典的访问和操作 获取值 添加或修改键值对 删除键值对 字典的

    2024年01月16日
    浏览(34)
  • 一种在 Python 中实现更快 OpenCV 视频流的多线程方法

    概述 在本文中,我们将看到两个没有多线程的 Python 代码示例,用于从摄像头读取视频帧。我们将看到使用/不使用多线程获得的 FPS 的差异。 什么是多线程? 线程是进程中的一个执行单元。多线程是指通过在线程之间快速切换对 CPU 的控制(称为上下文切换)来并发执行多个

    2024年02月16日
    浏览(58)
  • 解决Python中KeyError异常的方法

    解决Python中KeyError异常的方法 在Python编程中,KeyError是一种常见的异常,通常发生在使用字典或类似字典结构(如Python中的字典或列表)时,尝试访问一个不存在的键。当我们尝试使用一个不存在的键来获取字典中的值时,Python会引发KeyError异常。本文将介绍如何解决Python中的

    2024年02月03日
    浏览(30)
  • python运行报错 KeyError: “[‘...’] not in index”

    我在使用python指定列读取xlsx数据时遇到这个报错,具体原因不知。 这个错误通常表示你正在尝试访问一个不存在的索引或列。为了解决这个错误,你应该检查正在使用的代码并确定是否存在以下情况之一: 索引或列名错误: 检查是否在 DataFrame 中具有正确的索引或列名,可以

    2024年02月11日
    浏览(41)
  • 使用python在es中基本操作详解(添加索引、查询索引、删除索引、判断索引是否存在、添加数据、更新数据、查询数据)

    示例代码1: 运行结果: 示例代码2: 运行结果: 示例代码3: 运行结果: 注意: 对比上面几种建立索引的方法,是有一定区别的。根据响应结果可以看出: es. indices.create() 方法是标准的创建索引的方法,其它几种方法在创建索引的同时也会生成一条数据,并且生成mappin

    2024年02月11日
    浏览(197)
  • python判断文件夹是否存在,不存在则创建它,并将文件夹下所有的文件及子文件删除

    1、python判断文件夹是否存在,不存在则创建它,并将文件夹下所有的文件及子文件删除 2、python之判断文件文件夹是否存在,存在则删除,不存在则创建 2.1、删除文件于文件夹 使用os.remove删除文件夹会出现拒绝访问的错误,所以要使用以下方式进行删除 2.2、创建文件与文件

    2024年02月11日
    浏览(118)
  • MySQL:想实现sql语句进行批量删除数据库或表,而引发的熬夜探究

    因为在自测过程中,创建了很多数据库,一个个手动删除属实有点对不起程序员这个身份,那么有没有简单的sql语句操作来进行批量删除数据库呢?于是便有了本篇文章 上面图片是AI创作,未经允许,不可商用哦! 删库跑路需谨慎, 放弃一切亦不易。 了解到数据库或表的信

    2024年01月16日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包