我有一个长列表,其中每个元素都是长度为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]]
。
但是,我现在的实际输出仍然是原始的,未更改的列表。
答案 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]