python:两个从nums中删除val的程序

时间:2017-02-18 08:29:45

标签: python

编写一个python程序来从数组中删除val: 第一个程序是:

class Solution(object):
    def removeElement(self,nums,val):

        for x in nums:
            if x == val:
                nums.remove(val)
        return len(nums)

当nums为[3,3]时,val为3,输出为:1

第二个程序是:

class Solution(object):
    def removeElement(self,nums,val):

        while val in nums:
            nums.remove(val)
        return len(nums)

nums为[3,3],val为3,输出为:0

你可以告诉我区别和原因吗

2 个答案:

答案 0 :(得分:1)

Python很难迭代迭代过程中正在改变的东西。它可能会失败或返回意外结果或永远不会退出迭代。

  

因为容器甚至无法跟踪外部的迭代器   在它上面,甚至更少的钩子甚至改变方法来循环每一个这样的   迭代器,并以某种方式神奇地让每个迭代器知道   改变。这将是一个很微妙,复杂的代码和检查   减慢非常频繁的操作。

ggplot(data, aes(x = reorder(language, -pos), y = tone_percent, fill = tone)) + 
    geom_col() + 
    geom_text(aes(y = label_pos, label = paste0(round(tone_percent),"%"))) + 
    coord_flip() + 
    labs(x = "Language", y = "Percentage of tone") +
    scale_fill_manual(NULL, values=c('#F45E5A', '#5086FF', '#17B12B'), 
                      guide = guide_legend(reverse = TRUE)) + 
    theme_bw() + 
    theme(legend.position = "bottom", 
          legend.direction = "horizontal")

上面的代码不会退出迭代。所以正确的方法是使用列表推导来创建一个只包含你不想删除的元素的新列表:

nums=[3,4]
val=3

for x in nums:
    print(x,nums)
    if x > val:
        nums.append(4)

或就地改动:

print([i for i in nums if i!=val])

希望这有帮助。

答案 1 :(得分:0)

在第一个示例中,您将在迭代列表元素时删除列表中的元素。这是一个问题,因为您将在第一个remove之后用完迭代。

例如,如果列表是l = [1, 1, 2, 2],并且在删除第一个removeElement(l, 2)后致电2,则l的长度将为3,并且赢得了&# 39; t是剩下的任何迭代(列表将是[1, 1, 2],你将处于迭代次数3,这就是循环停止并返回[1, 1, 2])的原因。

在第二种情况下,while语句为:虽然列表中仍有2,但继续从列表中删除2。这样,在第一次迭代之后,l将看起来像[1, 1, 2]并且内部仍然会有一个2,所以循环继续,你得到[1, 1]

您可以使用l = [3, 3]在您的案例中应用此示例,看看您是否理解。

希望有所帮助:)