1
55
实现过滤的两种简单方法是:
注意,这两种情况都保留谓词函数计算结果为的值
编辑 滑稽的…两个人分别贴出了我在贴我的答案时提出的两个答案。 |
2
37
您还可以在列表上向后迭代:
这样做的好处是它不会创建新的列表(例如
请注意,尽管在向后迭代时删除元素是安全的,但是插入它们是比较棘手的。 |
3
28
显而易见的答案是约翰和其他几个人给出的答案,即:
但这样做的缺点是,它创建了一个新的列表对象,而不是重用原始对象。我做了一些分析和实验,我想到的最有效的方法是:
分配给“名称[:]”基本上意味着“用以下值替换名称列表的内容”。它不同于只分配给名称,因为它不会创建新的列表对象。赋值的右边是一个生成器表达式(注意使用括号而不是方括号)。这将导致python在列表中迭代。 一些快速分析表明,这比列表理解方法快30%,比过滤方法快40%。 告诫 :虽然这个解决方案比明显的解决方案快,但它更模糊,并且依赖于更高级的Python技术。如果您确实使用它,我建议您在使用时附带一条评论。它可能只在您真正关心这个特定操作的性能的情况下才值得使用(无论什么情况下都非常快)。(在我使用它的情况下,我进行了一次*波束搜索,并使用它从搜索波束中删除搜索点。) |
4
10
|
5
4
有时筛选(使用筛选或列表理解)不起作用。当其他对象持有对您正在修改的列表的引用,并且需要在适当的位置修改该列表时,就会发生这种情况。
与原始代码的唯一区别在于
|
6
3
这个过滤器太棒了。简单例子:
编辑: 科里的清单理解也很棒。 |
7
2
|
8
2
两种解决方案, 滤波器 和 理解 需要生成新列表。我不太了解Python的内部结构,但我 认为 更传统(但不太优雅)的方法可能更有效:
总之,对于简短的列表,我坚持前面提出的两个解决方案中的任何一个。 |
9
2
要回答有关使用字典的问题,您应该注意python 3.0将包括 dict comprehensions :
同时,你可以这样做一个准听写理解:
或者作为一个更直接的答案:
|
10
2
如果应该就地过滤列表,并且列表大小相当大,那么前面的答案中提到的基于list.remove()的算法可能不合适,因为它们的计算复杂性是o(n^2)。在这种情况下,您可以使用以下no so python函数:
编辑: 实际上,在 https://stackoverflow.com/a/4639748/274937 优于我的解决方案。它更像蟒蛇,工作速度更快。因此,下面是一个新的filter inplace()实现:
|
11
1
对于您的示例,过滤器和列表理解是可以的,但它们有几个问题:
您的原始解决方案实际上对非常大的列表更有效,即使我们同意它更丑。但是,如果您担心可以有多个“john smith”,可以根据位置而不是根据值删除:
我们不能在不考虑列表大小的情况下选择解决方案,但是对于大列表,我更喜欢您的2通解决方案,而不是筛选或列表理解 |
12
1
如果是一套。
|
13
1
这是我的
|
14
-2
很明显,这是您使用的数据结构的问题。例如,使用哈希表。有些实现支持每个键有多个条目,因此可以关闭最新的元素,或者删除所有的元素。 但这是,而且您将要找到的解决方案是,通过不同的数据结构实现优雅,而不是算法。也许你可以做得更好,如果它是排序的,或者什么的,但是列表上的迭代是你这里唯一的方法。 编辑: 有人意识到他要求“效率”…所有这些建议的方法只是对列表进行迭代,这与他建议的方法相同。 |
Hatsune Miku · 比较或if语句是否更快[已关闭] 1 年前 |
Black Swan · 无法解压缩的值太多(应为2)错误 1 年前 |
Kai · 有什么方法可以轻松优化VSCode中的锈迹? 2 年前 |
Balfar · 处理NumPy阵列上的循环最有效的方法是什么? 2 年前 |
Daniel · C#轻松存储快速访问的大型位矩阵 6 年前 |
halbe · 优化音频DSP程序的numpy计算 6 年前 |
Afsara · 是否有任何方法不能优化我们的应用程序? 6 年前 |