【问题标题】:Is there another way to delete list from a list? [duplicate]还有另一种方法可以从列表中删除列表吗? [复制]
【发布时间】:2021-10-25 07:05:30
【问题描述】:
a = [["A","B"],["C","D"],["D","E"]]

for i in range(len(a)):
  if i == 0:
    a[i] = []

print(a) # [[], ['C', 'D'], ['D', 'E']]

我在上面使用过从列表中删除内部列表,但它会打印 [] 。我想删除列表本身。

期望的输出:- [['C', 'D'], ['D', 'E']]

我在下面尝试的另一种方法适用于 i=0、i=1 甚至 i=2 但是当我的条件都是真的(一种情况)时,

a = [["A","B"],["C","D"],["D","E"]]

for i in range(len(a)):
  if True:
    a.pop(i)

print(a) # IndexError: pop index out of range

我知道使用 pop 会移动索引并导致错误超出范围。需要解决方案来解决这个问题。

【问题讨论】:

  • 关于'使用 pop 正在移动索引并导致错误超出范围':您可以通过反向迭代来避免该问题:for i in reversed(range(len(a))):
  • 我有条件并且必须验证检查,如果满足则只删除特定列表。我使用循环遍历所有内部列表,然后根据条件验证以删除该特定列表,或者如果满足所有条件,则删除所有列表。
  • 你应该把范围写成range(len(a)-1)

标签: python list


【解决方案1】:

很简单:

del a[0]

当然,当您从列表中删除一个元素时,其余元素的索引会发生变化。

听起来你要删除所有满足某些条件的元素,例如:

a = [4, 5, 1, 2, 8, 0]

# remove all the elements < 5 (i.e. only leave the ones >= 5):
result = [x for x in a if x >= 5]

列表推导式将是最 Pythonic 和最简单的方法。

如果您的条件仅适用于索引,而不适用于值,也可以通过理解来完成,例如,删除奇数索引处的所有元素(保留偶数索引处的元素):

a = [4, 5, 1, 2, 8, 0]
result = [x for n, x in enumerate(a) if n % 2 == 0]

【讨论】:

  • 我也在尝试 if True (当所有条件都满足时)。它会抛出索引超出范围错误。
  • @BethMckey 不,它会不会。您的代码将索引抛出范围之外,因为当元素被弹出时,索引会改变。
  • del a[0] 会更直接
  • 这只有在所有条件都满足的情况下才有效,但是当其中一个条件不喜欢时(如果 i == 1)它仍然会删除第 0 个索引列表,但在这里它应该删除第一个索引([“C ","D"]) 仅限。
  • @BethMckey,所以您想动态且有选择地删除列表?
【解决方案2】:

你可以只使用切片:

>>> a = [["A","B"],["C","D"],["D","E"]]
>>> a = a[1:]
>>> a
[['C', 'D'], ['D', 'E']]
>>> 

或者使用del关键字:

>>> a = [["A","B"],["C","D"],["D","E"]]
>>> del a[0]
>>> a
[['C', 'D'], ['D', 'E']]
>>> 

或者只是list.pop:

>>> a = [["A","B"],["C","D"],["D","E"]]
>>> a.pop(0)
['A', 'B']
>>> a
[['C', 'D'], ['D', 'E']]
>>> 

或者拆包:

>>> a = [["A","B"],["C","D"],["D","E"]]
>>> _, *a = a
>>> a
[['C', 'D'], ['D', 'E']]
>>> 

编辑迭代:

试试enumerate:

>>> a = [["A","B"],["C","D"],["D","E"]]
>>> [v for i, v in enumerate(a) if i != 0]
[['C', 'D'], ['D', 'E']]

【讨论】:

  • 我个人更喜欢切片而不是del
  • @Sujay 我也是,检查所有解决方案:)
  • @Sujay 我也喜欢切片的
  • 某些看起来更复杂和pythonic
  • 谢谢,但正如我所说,当我的所有条件都满足时,即使 del 会抛出 index out of range 错误。
猜你喜欢
  • 2015-05-16
  • 2018-09-30
  • 2011-01-31
  • 2016-09-08
  • 2023-02-25
  • 1970-01-01
  • 1970-01-01
  • 2019-04-15
  • 2011-02-17
相关资源
最近更新 更多