当前位置: 首页 > 面试题库 >

从列表中删除字典

潘俊
2023-03-14
问题内容

如果我有词典列表,请说:

[{'id': 1, 'name': 'paul'},
 {'id': 2, 'name': 'john'}]

并且我想删除具有id2(或name
'john')的字典,以编程方式解决此问题的最有效方法是什么(也就是说,我不知道列表中条目的索引,因此它可以)只是被弹出)。


问题答案:
thelist[:] = [d for d in thelist if d.get('id') != 2]

编辑
:由于对此代码的性能提出了一些疑问(一些基于对Python的性能特征的误解,一些基于超出给定规范的假设,即列表中仅存在一个dict,其key的值为2)
id”),我希望在此方面给您保证。

在旧的Linux机器上,测量以下代码:

$ python -mtimeit -s"lod=[{'id':i, 'name':'nam%s'%i} for i in range(99)]; import random" "thelist=list(lod); random.shuffle(thelist); thelist[:] = [d for d in thelist if d.get('id') != 2]"
10000 loops, best of 3: 82.3 usec per loop

其中约57微秒用于random.shuffle(需要确保要删除的元素始终不在同一位置;-),而初始副本则为0.65微秒(最担心Python列表的浅表副本对性能的影响最大)显然是在吃午饭了;-),需要避免更改循环中的原始列表(因此循环的每一行确实都有一些要删除的内容;-)。

当知道只有一个要删除的项目时,可以更快速地找到并删除它:

$ python -mtimeit -s"lod=[{'id':i, 'name':'nam%s'%i} for i in range(99)]; import random" "thelist=list(lod); random.shuffle(thelist); where=(i for i,d in enumerate(thelist) if d.get('id')==2).next(); del thelist[where]"
10000 loops, best of 3: 72.8 usec per loop

(当然,如果您使用的是python
2.6或更高版本,请使用next内置函数,而不要使用该.next方法)-但是,如果满足删除条件的命令数量不完全相同,则此代码将崩溃。概括地说,我们有:

$ python -mtimeit -s"lod=[{'id':i, 'name':'nam%s'%i} for i in range(33)]*3; import random" "thelist=list(lod); where=[i for i,d in enumerate(thelist) if d.get('id')==2]; where.reverse()" "for i in where: del thelist[i]"
10000 loops, best of 3: 23.7 usec per loop

众所周知,在这里可以删除混洗,因为已经删除了三个等距的字典。而listcomp保持不变:

$ python -mtimeit -s"lod=[{'id':i, 'name':'nam%s'%i} for i in range(33)]*3; import random" "thelist=list(lod); thelist[:] = [d for d in thelist if d.get('id') != 2]"
10000 loops, best of 3: 23.8 usec per loop

完全并驾齐驱,甚至只需删除99个元素中的3个。有了更长的列表和更多的重复,这当然具有更多的优势:

$ python -mtimeit -s"lod=[{'id':i, 'name':'nam%s'%i} for i in range(33)]*133; import random" "thelist=list(lod); where=[i for i,d in enumerate(thelist) if d.get('id')==2]; where.reverse()" "for i in where: del thelist[i]"
1000 loops, best of 3: 1.11 msec per loop
$ python -mtimeit -s"lod=[{'id':i, 'name':'nam%s'%i} for i in range(33)]*133; import random" "thelist=list(lod); thelist[:] = [d for d in thelist if d.get('id') != 2]"
1000 loops, best of 3: 998 usec per loop

总而言之,显然不值得部署制作和反转索引列表以删除的精妙之处,而不是完全简单明了的列表理解,在一个小情况下可能会增加100纳秒,而在较大的情况下会损失113微秒。
;-)。避免或批评简单,直接,完美的性能适当的解决方案(例如对此类“从列表中删除某些物品”问题的一般理解),是Knuth和Hoare的著名论点,即“过早的优化是编程中所有邪恶的根源!-)



 类似资料:
  • 问题内容: 如果嵌套字典前面没有键,我现在可以删除重复项。我可以使用此功能的字典列表的一个示例是: 但是,我希望能够根据键和该词典中关联的所有值删除重复项。因此,如果内部有相同的键但值不同,则我不想删除它,但是如果有完整的副本,则将其删除。 我该怎么做呢?谢谢。 问题答案: 要从字典列表中删除重复项,请执行以下操作:

  • 问题内容: 我有一个停用词列表。我有一个搜索字符串。我想从字符串中删除单词。 举个例子: 现在,代码应删除“ What”和“ is”。但是在我的情况下,它会去除“ a”和“ at”。我在下面给出了我的代码。我可能做错了什么? 如果输入查询为“什么是Hello”,则输出为: 为什么会这样? 问题答案: 这是一种方法: 我注意到,如果列表中包含小写字母,您还希望删除该单词,因此我在条件检查中添加了对的

  • 问题内容: 我有一个清单 我正在尝试删除其超字符串已经在列表中的字符串。在这种情况下,结果应为: 我已经写了代码: 但它似乎不起作用。我读过,我们无法在列表上进行迭代时将其删除。因此,副本,而这是我的原始列表。 问题答案: l=[‘abc’,’abcdef’,’def’,’defdef’,’polopolo’] print [j for i, j in enumerate(l) if all(j

  • 问题内容: 如果我需要从List中删除一个对象(假设字符串“ abc” linkedList或ArrayList),则可以删除哪一个?(我认为两者都是相同的) ,如果我使用Linkedlist和arraylist,那么时间和空间的复杂度是多少 (我相信两者的时间复杂度都为O(n)相同) 问题答案: 两者都具有相同的时间复杂度-O(n),但是恕我直言,该版本会更快,尤其是在大型列表中,因为当您从数组

  • 问题内容: 在遍历列表时,我想根据条件删除列表中的项。请参见下面的代码。 这给了我一个例外。 如何才能做到这一点? 问题答案: 您需要使用和调用上,而不是使用循环。

  • 问题内容: 对此问题的任何帮助将不胜感激。 我有一个元组列表 并且我需要删除某种类型的重复项:根据我的定义,(1,2)和(2,1)被视为重复项。所需输出 提前致谢 问题答案: 您可以对它们进行排序,然后使用删除重复项: