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不应该在列表中。因为他们 不在小名单中。
我做错了什么?
答案 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))
请注意,这会按排序顺序返回列表,这可能与原始订单不同。