del语句不适用于列表

时间:2018-03-13 21:54:52

标签: python arrays loops del

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

我想循环通过长期的父母"列出并删除任何"孩子"列出整数小于3的位置。这是我的代码。

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]]

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

2 个答案:

答案 0 :(得分:3)

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

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

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

正如@AntonvBR的评论所述,上面的代码片段可以简化为以下列表理解

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

示例

如果lst设置为

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

然后结果列表将是

[['whose', 3]]

<强>解释

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

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

答案 1 :(得分:0)

您希望对此使用简单的列表解析:

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