复制返回的数字多于所需数量

时间:2016-11-05 15:24:48

标签: python

a = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

if len(set(a)) > len(set(b)):  # finds the biggest list
    largest = a
    smallest = b
else:
    largest = b
    smallest = a

common = largest

for i in largest:
    if i not in smallest:
        common.remove(i)

print(common)

打印:[1,2,3,5,7,8,10,12,13] 7,9,10,11,12不应该在列表中。因为他们 不在小名单中。

我做错了什么?

2 个答案:

答案 0 :(得分:2)

您的代码依赖于

等语句的假设
  

最大=α

将列表a复制到最大。 在Python中不是这样。而是该语句最大限度地引用旧列表a。

正确复制列表的代码应如下所示:

a = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

if len(set(a)) > len(set(b)):  # finds the biggest list
    largest = list(a)
    smallest = list(b)
else:
    largest = list(b)
    smallest = list(a)

common = list(largest)

for i in largest:
    if i not in smallest:
        common.remove(i)

print(common)

然后您将获得结果

[1,2,3,5,8,13]

答案 1 :(得分:2)

您的第common = largest行不会将列表largest的值复制到新列表common中。它更确切地说,这些变量都是指向相同列表的指针。因此,当您循环largest并从common删除时,您正在修改正在循环的列表。这是个坏主意。

使用

制作真实副本
common = largest[:]

common = list(largest)

然而,在两个列表中获得良好的元素列表的更多pythonic方法只是单行

common = sorted(set(a) & set(b))

请注意,这会按排序顺序返回列表,这可能与原始订单不同。