如何处理未评估为 True 的逻辑测试[重复]

问题描述 投票:0回答:2

我用 Python 编写了一个 for 循环,并在 CS 课程的讨论帖子中提交了该循环。它涉及从列表中提取偶数元素并将它们附加到另一个列表中。我编写了以下代码,我认为应该可以很好地工作。

data = [9,4,5,17,12,14,1,0,3,10,9]
even = []
for item in data:
    if (item % 2) == 0:
        data.remove(item)
        even.append(item)
    else:
        pass

令我惊讶的是,运行代码后得到了以下结果。

muyiwa@mobadara-pc:~/Documents/projects/DSA-2/Unit2$ python fixed_.code.py 
The even elements are: [4, 12, 0, 10]
The odd elements are: [9, 5, 17, 14, 1, 3, 9]

我相信作为偶数的元素“14”不应该再出现在奇数列表中,因为

14 % 2 == 0
的计算结果为
True

请帮帮我。

python algorithm for-loop big-o
2个回答
0
投票

发生这种情况是因为您在循环中删除项目,从而跳过数字 14。

您在云中创建了一个名为 odd 的新列表:

data = [9,4,5,17,12,14,1,0,3,10,9]
even = []
odd = []
for item in data:
    if (item % 2) == 0:
        even.append(item)
    else:
        odd.append(item)
    
print(odd)
print(even)

0
投票

为什么在迭代列表时不应修改列表:

正如前面的评论所说,您在迭代列表时修改列表。 使用 data.copy() 迭代列表的副本。

以下是您的方法所发生的情况:

  1. 代码查看索引 0 处的内容
  2. 索引 0 处的值为奇数:不执行任何操作。
  3. 看看索引 1 处有什么。
  4. 值是偶数。删除该值。将值附加到“偶数”列表中。
  5. 看看索引 2 处有什么:值 17。为什么?因为您从列表中删除了一个值。因此,之前位于索引 3 的值 17 现在位于索引 2。

当您迭代列表的副本时,您可以评估副本内的值,同时从原始列表中删除您想要的任何内容。你不会破坏你的索引。

data = [9,4,5,17,12,14,1,0,3,10,9]
even = []
for item in data.copy():
    if (item % 2) == 0:
        data.remove(item)
        even.append(item)
    else:
        pass

print(data) : [9, 5, 17, 1, 3, 9]
print(even) : [4, 12, 14, 0, 10]
© www.soinside.com 2019 - 2024. All rights reserved.