从列表中删除不在元组中的项目

时间:2015-03-16 06:19:47

标签: python list

编写并测试Python函数leppard以浏览zoo_list并删除任何不在zoo_dictionary中的项目。使用以下元组作为字典:

(“狮子”,“老虎”,“熊”,“chupacabra”,“长颈鹿”,“懒惰”)

n = int(input("Enter the number of animals: "))
zoo_list = []
zoo_dictionary = ( "lion", "tiger", "bear", "chupacabra", "giraffe", "sloth" )
for i in range(n):
    lists = input("Enter the names of each animal: ")
    zoo_list.append(lists)


for i in range(n-1):
    if zoo_list[i] not in zoo_dictionary:
        zoo_list1 = zoo_list.pop(i)

print(zoo_list)

这是我的代码,但是当我输入“cat”“dog”“lion”“bear”“monkey”时 我的清单显示[“狗”,“狮子”,“熊”] 有什么理由吗?拜托,谢谢你:)

3 个答案:

答案 0 :(得分:1)

在第二个for循环的第一次迭代中,当i的值为0时, 当你做的时候

zoo_list1 = zoo_list.pop(i)

删除列表中索引0处的元素。现在列表变为

["dog", "lion", "bear", "monkey"]

现在循环继续,并且在循环的第二次迭代中,i的值为1,并且在新列表(在第一次迭代之后形成)中,索引1处的元素是" lion"。因此,你错过了元素" dog"。

你所说的字典实际上是一套,而不是字典。

答案 1 :(得分:0)

正如其他一个答案中所提到的那样,改变你试图迭代的列表是一种灾难。而是构建一个新列表,然后将该列表分配给zoo_list

n = int(input("Enter the number of animals: "))
zoo_list = []
zoo_dictionary = ("lion", "tiger", "bear", "chupacabra", "giraffe", "sloth")
for i in range(n):
    zoo_list.append(input("Enter the names of each animal: "))

zoo_list = [animal for animal in zoo_list if animal in zoo_animals]
print(zoo_list)

我已删除对lists变量的不必要分配。我还删除了你的错误for循环,并将其替换为列表理解。如果你想使用for循环,你可以做这样的事情

temp = []
for animal in zoo_list:
    if animal in zoo_dictionary:
        temp.append(animal)
zoo_list = temp

您也可以使用内置函数filter。用以下内容替换列表推导或for循环(无论使用哪种方法)。

zoo_list = filter(lambda x : x in zoo_animals, zoo_list)

你会得到相同的结果。

答案 2 :(得分:-1)

我认为你应该在这里使用while循环。这是Python 2的代码。

    n = int(input("Enter the number of animals: "))
    zoo_list = []
    zoo_dictionary = ( "lion", "tiger", "bear", "chupacabra", "giraffe", "sloth" )

    while len(zoo_list) < n:
        item = input("Enter the names of each animal: ")
        zoo_list.append(item)

    print zoo_list, len(zoo_list)
    for i in range(n-1):
        if zoo_list[i] in zoo_dictionary:
            zoo_list.remove(zoo_list[i])

    print zoo_list