两个无重复元素列表的共同元素

3

问题是这样的,有两个列表,例如这两个:

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]

编写一个程序,返回一个仅包含两个列表共同元素(不包括重复元素)的列表。确保您的程序适用于大小不同的两个列表。

以下是我的代码:

a = [1, 1, 2, 2, 3, 5, 8, 13, 21, 34, 55, 89]
b = [1, 2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
c = []
for i in a:
    if i in b and i not in c:
        c.append([i])
print(c)

尽管使用了“i not in c”语句,但我的输出仍然会出现重复项。为什么会这样?我相信这显而易见,只是我看不到!


你为什么要添加 [i]?当 1 in cc 中查找并找到 [1] 时,它不会认为它们是相同的。请移除方括号。 - Dimitris Fasarakis Hilliard
3
可能是两个列表之间的公共元素比较的重复内容。 - Ma0
7个回答

14
  1. 将包含i的列表附加到c中,因此i not in c始终返回True。您应该单独附加ic.append(i)

或者

  1. 如果顺序不重要,则仅使用集合:

    a = [1, 1, 2, 2, 3, 5, 8, 13, 21, 34, 55, 89]
    b = [1, 2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
    c = set(a) & set(b)  #  & calculates the intersection.
    print(c)
    #  {1, 2, 3, 5, 8, 13}
    

编辑 如评论中@Ev. Kounis所建议的那样,您可以通过使用
c = set(a).intersection(b)来提高一些速度。


2
“set(a).intersect(b)” 会更快一些,因为它避免了对第二个“list”进行“set”转换。 - Ma0
1
@Ev.Kounis 非常有趣的一点,我们需要检查 C 代码,但我认为可以合理地假设 .intersection 转换参数为集合形式(如果它不是),因此不会有更好的性能表现。 - DeepSpace
1
如果我理解正确,字节码表明它更快一些。这是一个**加载全局变量+二进制和加载属性**的区别。 - Ma0
1
@Ev.Kounis 嗯,使用 timeit.Timera = list(range(2000)) 以及 b = list(range(1500, 3000))myfunc 返回了 0.023480591458422184,而 myfunc2 返回了 0.012913368929072355,所以是的,它执行得稍微快一些。 - DeepSpace
实际上,这比我想象的要多得多,几乎快了近一倍 - Ma0
谢谢!我知道这是些简单的东西,只是我自己看不到。 - Charlie Miller

3
使用列表推导式,我认为如果按照以下方式实现,它会变得简短而简单。
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]
[i for i in a and b if i in a and b]

结果:

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

0

初始化列表a、b和result

a = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

b = [1, 2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

result = []

使用列表推导式追加列表结果

[(result.append(i)) for i in a if i in b and i not in result]

print(result)   # [1, 2, 3, 5, 8, 13]

感谢您提供答案。您是否可以编辑您的答案并包含代码解释?这将有助于未来的读者更好地理解正在发生的事情,特别是那些对该语言感到陌生并且难以理解概念的社区成员。 - STA

0
a = set(a)
b = set(b)
c = a. intersection(b)
c = list(c)
print(c)

这正是被接受的答案所建议的。 - Martin
虽然这段代码可能回答了问题,但提供有关它如何以及/或为什么解决问题的附加上下文将改善答案的长期价值。您可以在帮助中心找到有关编写良好答案的更多信息:https://stackoverflow.com/help/how-to-answer。祝你好运! - nima

0
使用集合的直觉,你可以这样做...
filtered_arr = list(set(b)-set(a))
首先将两个数组转换为集合,然后取其差集,并再次将结果转换为列表。

0
c = []
for items in a:
    for numbers in b:
        if items == numbers:
            if items in c:
                None
            else:
                c.append(items)
print(c)

2
虽然这段代码可能提供了解决问题的方案,但强烈建议您提供有关为什么和/或如何回答问题的其他上下文信息。仅提供代码答案通常在长期内变得无用,因为未来遇到类似问题的观众无法理解解决方案背后的推理。 - E. Zeytinci

0
以下代码可以正常工作:
newlist = []
for x in b:
    if x in a:
        if x in newlist:
            print("duplicate")
        else:
            newlist.append(x)

for y in newlist:
    print(y)   

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