Python列表减法

5
这是一个实践例子:
编写一个函数 (list1, list2),它接受两个列表作为参数,并返回一个列表,该列表是从 list1 中删除可以在 list2 中找到的元素的结果。
为什么这个函数返回 [1, 3, 4] 而不是我想的 [4]?我认为这与 list1.remove() 有关。我猜这是一些显而易见的东西,但我看不出来。
它适用于以下示例:
subtractList (['a', 'b', 'c', 'd'], ['x', 'y', 'z']) =
    ['a', 'b', 'c', 'd']

subtractList([1,2,3,4,5], [2, 4]) =
    [1, 3, 5]

但是在这个例子中失败了:
subtractList(range(5), range(4))

我注意到它仅从列表中删除偶数。以下是代码:
def subtractList(list1,list2):
    list1 = list(list1)
    list2 = list(list2)

    for i in list1:
        if i in list2:
            list1.remove(i)

    return list1

我已经用以下方法解决了这个练习:

def subtractList(list1,list2):

    new_list = []

    list1 = list(list1)
    list2 = list(list2)

    for i in list1:
        if i not in list2:
            new_list.append(i)

    return new_list

4
请修正你的格式,特别是缩进。目前来看很难帮助你。 - Ffisegydd
你正在使用Python 3还是Python 2? - Ffisegydd
另外,由于您已经传递了列表(range(x)也是一个列表),将它们再次转换为列表(list1 = list(list1))是不必要的。 - thumbtackthief
Python3,是的range函数也会返回一个列表,但我想确保如果有人输入类似元组的东西,它仍然可以工作。 - Jasko
思路不错,但是我的列表推导式解决方案和你的函数解决方案都可以在元组上工作。 - thumbtackthief
显示剩余4条评论
2个回答

4

通过作弊让您的教授刮目相看:

def subtract_list(l1, l2):
    return list(sorted(set(l1) - set(l2)))

是的,我也想到了集合哈哈 - Jasko
这可能会改变list1的顺序。 - dawg

4

在迭代列表时更改列表会导致问题。你的第二个解决方案还不错,或者你可以查看“列表推导式”。在这种情况下:

new_list = [num for num in list1 if num not in list2]

说实话,对于一个Python初学者来说,我认为你出错的原因并不明显。 :) - thumbtackthief

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接