两个列表之间的公共元素,没有重复

时间:2017-11-23 11:46:27

标签: python python-3.x list duplicates

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

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)

尽管'我不在c'声明,我的输出仍然给我重复。为什么是这样?我敢肯定它显而易见,我只是看不到它!

6 个答案:

答案 0 :(得分:4)

  1. 您要将包含i的列表附加到c,因此i not in c始终返回True。您应该自行添加ic.append(i)
  2. 或者

    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}
      
    2. 编辑作为@Ev。 Kounis在评论中建议,你将通过使用
      获得一些速度 c = set(a).intersection(b)

答案 1 :(得分: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)   

答案 2 :(得分:0)

使用集合的直觉,您可以执行以下操作...

filtered_arr = list(set(b)-set(a))

首先将2个数组转换为集合,然后用其替代将结果再次转换为列表。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

使用列表推导,我认为如果按照以下方式实现,它将变得简短而简单

Show All Branches

结果:

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]

答案 5 :(得分:0)

初始化列表a、b和结果

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]