【问题标题】:del statement not working for listdel 语句不适用于列表
【发布时间】:2018-08-22 07:36:14
【问题描述】:

我有一个长列表,其中每个元素都是一个长度为 2 的列表。每个列表的第一个元素是一个字符串,每个列表的第二个元素是一个与字符串对应的整数。

我想遍历长长的“父”列表并删除整数小于三的所有“子”列表。这是我的代码。

for i in range(len(fontsizenum) / 2):
   if int(fontsizenum[i][1]) < 3:
      del fontsizenum[i]

但是,当我之后打印列表时,它不起作用,它仍然包含数字小于三的值。

说这是我要更改的列表。

fontsizenum = [[cereal, 1], [dog, 4], [cat, 2], [water, 5]]

预期的输出是[[dog, 4], [water, 5]]

但是,我现在的实际输出仍然是原始的、未更改的列表。

【问题讨论】:

  • 你能添加一个构成列表的数据示例吗?
  • @AlexZhang 将新信息添加到您的原始帖子中。另外,请包括给定输入列表的预期结果。
  • @AlexZhang 请学习在您的问题中格式化代码 sn-ps 以便于阅读。看看我是如何编辑你的问题的。

标签: python arrays loops del


【解决方案1】:

结果列表仍然包含意外值,因为您在迭代列表时正在修改列表。在几乎所有情况下,您都应该避免在迭代时修改可迭代对象。

如果您将代码更改为以下内容,则结果列表应该是您所期望的。

new_lst = []
for idx, value in enumerate(lst):
    if value[1] >= 3:
        new_lst.append(value)

正如@AntonvBR 在 cmets 中所指出的,上面的 sn-p 可以简化为以下列表理解

[i for i in lst if i[1] > 3]

示例

如果lst 设置为

[
  ['forbidden', 1],
  ['hath', 1],
  ['causes', 2],
  ['whose', 3],
]

那么结果列表将是

[['whose', 3]]

说明

我的代码 sn-p 创建了一个新列表,其中包含旧列表中的元素。值得注意的是,这使我们可以避免修改旧列表。

我更改了 if 语句中的条件以检查是否 include,而不是 exclude,一个元素。最后,如果该检查得到满足,那么我将该值附加到新列表中。

【讨论】:

  • 这是一个有用的解决方案,但如果您想要避免创建新列表的东西,我会推荐类似解决方案 here
【解决方案2】:

您想为此使用简单的列表推导:

expectedoutput = [i for i in fontsizenum if i[1] >= 3] 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-04
    • 2019-04-18
    • 2017-11-05
    • 2018-07-22
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    相关资源
    最近更新 更多