![]() |
1
663
可以使用列表理解创建一个仅包含不想删除的元素的新列表:
或者,通过分配给切片
如果有其他参考资料,这种方法可能很有用
除了理解,你还可以使用
或者在Python 3中:
|
![]() |
2
518
建议列表理解的答案几乎是正确的——只是他们构建了一个全新的列表,然后给它起与旧列表相同的名称,因为他们没有适当地修改旧列表。这与选择删除不同,如@lennart的建议——它更快,但是如果您的列表是通过多个引用访问的,那么您只是重新放置其中一个引用,而不更改列表对象本身会导致细微的灾难性错误。 幸运的是,很容易获得列表理解的速度和就地更改所需的语义——只需代码:
注意与其他答案的细微差别:这一个不是分配给一个空名称-它分配给一个恰好是整个列表的列表切片,从而替换列表 内容 在同一个python列表对象中 ,而不是像其他答案一样重新放置一个引用(从以前的列表对象到新的列表对象)。 |
![]() |
3
227
您需要获取列表的一个副本,并首先对其进行迭代,否则迭代将失败,并可能导致意外的结果。 例如(取决于列表的类型):
一个例子:
|
![]() |
4
98
你需要向后走,否则就有点像锯掉你坐在上面的树枝。
python 2用户:替换
|
![]() |
5
46
对于这样一个例子,您最好的方法是 list comprehension
如果你做的事情比打电话给
使用复制列表
|
![]() |
6
38
这个 official Python 2 tutorial 4.2. "for Statements" 说 :
建议如下: https://stackoverflow.com/a/1207427/895245 这个 Python 2 documentation 7.3. "The for statement" 给出同样的建议 :
巨蟒能做得更好吗? 似乎可以改进这个特定的python API。比较它,例如,它的Java对应 ListIterator 这就清楚地表明,除了使用迭代器本身之外,您不能修改正在迭代的列表,并提供了在不复制列表的情况下进行修改的有效方法。来吧,巨蟒! |
![]() |
7
36
对于那些喜欢函数式编程的人:
或
|
![]() |
8
10
如果当前列表项满足所需的条件,也可以创建新列表。 所以:
为了避免用新列表名称重新编码整个项目:
注意,在python文档中:
|
![]() |
9
10
我需要用一个巨大的列表来完成这项工作,并且复制这个列表似乎很昂贵,特别是在我的例子中,与保留的项目相比,删除的数量是很少的。我采取了这种低级的方法。
我不知道与复制一个大列表相比,两个删除的效率有多高。如果您有任何见解,请发表评论。 |
![]() |
10
8
此答案最初是针对已标记为重复的问题编写的: Removing coordinates from list on python 代码中有两个问题: 1)当使用remove()时,您尝试移除整数,而需要移除元组。 2)for循环将跳过列表中的项目。 让我们来看看在执行代码时会发生什么:
第一个问题是您将“a”和“b”同时传递给remove(),但remove()只接受一个参数。那么我们如何才能让remove()正确地处理您的列表呢?我们需要弄清楚您列表中的每个元素是什么。在这种情况下,每个都是一个元组。要看到这个,让我们访问列表中的一个元素(索引从0开始):
啊哈!l1的每个元素实际上是一个元组。所以这就是我们需要传递来移除()的内容。python中的元组非常简单,只需将值括在括号中就可以了。”a,b“不是一个元组,但”(a,b)“是一个元组。因此,我们修改您的代码并再次运行它:
此代码运行时没有任何错误,但让我们看看它输出的列表:
为什么(1,-2)仍然在您的列表中?事实证明,在使用循环迭代列表的同时修改列表是一个非常糟糕的主意,不需要特别注意。(1,-2)保留在列表中的原因是,在for循环的迭代之间,列表中每个项的位置都发生了更改。让我们看看如果我们向上面的代码提供一个更长的列表会发生什么:
从结果中可以推断,每当条件语句的计算结果为true并且移除列表项时,循环的下一次迭代将跳过对列表中下一项的计算,因为其值现在位于不同的索引中。 最直观的解决方案是复制列表,然后迭代原始列表,只修改副本。您可以这样做:
但是,输出将与之前相同:
这是因为当我们创建L2时,python实际上并没有创建新的对象。相反,它只是将l2引用到与l1相同的对象。我们可以用“is”来验证这一点,它与“equals”(==)不同。
我们可以使用copy.copy()生成一个真正的副本。然后一切按预期工作:
最后,还有一个比制作一个全新的L1副本更干净的解决方案。reversed()函数:
不幸的是,我无法充分描述revered()的工作方式。当一个列表传递给它时,它返回一个“listReverseIterator”对象。出于实际目的,您可以将其视为创建其论点的反向副本。这是我推荐的解决方案。 |
![]() |
11
4
如果您想在迭代过程中执行其他操作,那么最好同时获取索引(这可以保证您能够引用它,例如,如果您有一个dict列表)和实际的列表项内容。
|
![]() |
12
4
你可能想用
有关详细信息 check here |
![]() |
13
3
您可以尝试反向循环,因此对于某些列表,您可以执行如下操作:
这样索引就可以对齐,并且不会受到列表更新的影响(不管是否弹出cur元素)。 |
![]() |
14
3
一个可能的解决方案,如果您不仅想删除某些内容,而且还想在单个循环中对所有元素执行某些操作,那么它很有用:
|
![]() |
15
2
我需要做一些类似的事情,在我的例子中,问题是内存——我需要在一个列表中合并多个数据集对象,在对它们做了一些事情之后,作为一个新的对象,并且需要去掉我正在合并的每个条目,以避免复制所有的数据集对象,并炸毁内存。在我的例子中,将对象放在字典中而不是列表中可以很好地工作: ` `
` ` |
![]() |
16
2
TLDR: 我写了一个图书馆,允许你这样做:
如果可能的话,最好使用另一种方法,在迭代ITerable时不需要修改它,但是对于某些算法,它可能不是那么直接的。因此,如果您确定您确实想要原始问题中描述的代码模式,那么这是可能的。 应该处理所有可变序列,而不仅仅是列表。 完全回答: 编辑:此答案中的最后一个代码示例给出了 为什么? 有时您可能希望在适当的位置修改列表,而不是使用列表理解。答案的第一部分作为 怎样 可以就地修改数组。 解决方法如下: this 回答(有关问题)。这解释了在遍历已修改的列表时如何更新数组索引。下面的解决方案旨在正确跟踪数组索引,即使修改了列表。
下载
这将产生以下输出:
上面我们用了
唯一的条件是,如果在任何时候
即
如果要访问列表的当前索引值,则不能使用枚举,因为这只计算for循环已运行的次数。相反,我们将直接使用迭代器对象。
这将输出以下内容:
这个
更多示例/测试可在
正如我前面所说:这是一个复杂的解决方案,它会损害代码的可读性,并使调试更加困难。因此,其他解决方案,如大卫·拉兹尼克所提到的清单理解 answer 应该首先考虑。也就是说,我发现这个类对我有用的时候,比跟踪需要删除的元素的索引更容易使用。 编辑:正如评论中所提到的,这个答案并没有真正提出一个问题,这个方法为这个问题提供了解决方案。我将尝试在这里解决这个问题: 列表理解提供了一种生成新列表的方法,但是这些方法倾向于孤立地查看每个元素,而不是将列表的当前状态作为一个整体。 即
但是如果结果是
下面的代码是遭受上述问题的算法的一个例子。该算法将减少一个列表,使任何元素都不是任何其他元素的倍数。
输出和最终缩减列表如下所示
|
![]() |
17
1
其他的答案是正确的,从正在迭代的列表中删除通常是一个坏主意。反向迭代可以避免这些陷阱,但是遵循这样做的代码要困难得多,因此通常最好使用列表理解或
但是,有一种情况是可以安全地从正在迭代的序列中删除元素:如果在迭代时只删除一个项。这可以通过使用
当您对满足某些条件的列表中的第一个项目执行一些具有副作用的操作,然后在之后立即从列表中删除该项目时,这通常比列表理解更容易理解。 |
![]() |
18
1
这里的大多数答案都希望您创建列表的副本。我有一个用例,其中的列表很长(11000个项目),所以最好继续减少列表。 首先,你需要 用while循环替换foreach循环 ,
价值
|
![]() |
19
1
最有效的方法是列表理解,很多人展示他们的案例,当然,这也是获得
有一个例子(从元组中得到赔率):
注意:您也不能处理迭代器。迭代器有时比序列更好。 |
![]() |
20
1
我可以想出三种方法来解决你的问题。例如,我将创建一个元组的随机列表
我选择的是一个随机选择的例子。 随时改变 这个 元组列表 以及 条件 我选择的。
方法1 .gt;
使用您建议的框架(在for循环中填充代码)。我用一个小代码
方法2 .gt; 构造一个新列表,其中包含不满足给定条件的元素(元组)(这与删除满足给定条件的列表元素相同)。代码如下:
方法3 .gt; 找到满足给定条件的索引,然后使用与这些索引对应的移除元素(元组)。下面是代码。
方法1和方法2比方法3快
. 方法2和方法3比方法1更有效。我
首选方法2
. 对于上述示例,
|
![]() |
21
0
对于任何可能非常大的项目,我都使用以下内容。
这应该比其他任何事情都快得多。 |
![]() |
22
0
在某些情况下,当您不仅仅是一次过滤一个列表项时,您希望在迭代时更改迭代。 这里有一个示例,其中预先复制列表是不正确的,反向迭代是不可能的,并且列表理解也不是一个选项。
|
![]() |
23
-1
现在您想要创建一个列表的副本,这样当您迭代和删除该列表中满足特定条件的元组时,可以将其作为引用。 然后,它取决于您希望输出的列表类型,无论是已删除元组的列表还是未删除的元组的列表。 正如大卫指出的,我建议列表理解来保留不想删除的元素。
|
![]() |
July · 如何定义数字间隔,然后四舍五入 1 年前 |
![]() |
user026 · 如何根据特定窗口的平均值(行数)创建新列? 1 年前 |
|
Ashok Shrestha · 需要追踪特定的颜色线并获取坐标 1 年前 |
![]() |
Nicote Ool · 在FastApi和Vue3中获得422 1 年前 |
|
Abdulaziz · 如何对集合内的列表进行排序[重复] 1 年前 |
![]() |
asmgx · 为什么合并数据帧不能按照python中的预期方式工作 1 年前 |