【问题标题】:List overlap finder [duplicate]列表重叠查找器[重复]
【发布时间】:2019-10-07 17:14:52
【问题描述】:

我有两个列表:

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 (a[i]==b[i]):
    print(i)```

But I got this error:
IndexError: list index out of range,


I expect result:
1 , 2 , 3 , 5 , 8 , 13

【问题讨论】:

  • 尝试使用sets
  • list a 的元素少于list b,这就是您收到索引错误的原因
  • print(set(a).intersection(set(b)))
  • 问题在我回答之前就关闭了,所以只是添加(a)可以在没有集合的情况下执行此操作(b)其他人正确指出索引错误是因为您的列表长度不同.然而,问题远不止于此。您犯的根本错误是比较相同位置的元素。 Intersection 不关心顺序(这也是为什么集合比这里的列表更好)。
  • 你确定你理解这个问题吗? “重叠”应该是什么意思?您可以将任务解释为查找匹配元素,即a 的第 n 个元素与b 的第 n 个元素具有相同值的情况。您可以将任务解释为寻找共同元素,即在两个列表中都找到的值。但如果是后者,为什么a 的数字 1 出现了两次(除了 a 恰好是斐波那契数)。

标签: python list


【解决方案1】:

您收到此错误是因为一个list 比另一个长。要解决这个问题,您可以简单地将lists 转换为sets 以消除重复,然后使用intersection

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]

list(set(a) & set(b))
# >> [1, 2, 3, 5, 8, 13]

【讨论】:

  • 重叠部分有重复元素怎么办?
  • 不可能,set(a)set(b) 没有重复,因为它们是set,因此intersection 也不会有重复。
  • 这正是我的观点。从 OP 的示例中不清楚,但至少它们表明列表可以有重复项。那么如果a = [1,1,2], b = [1,1,3] 呢?我认为“重叠”应该是[1,1],但你的只会产生[1]
  • 我明白你的意思,但是如果看一下@555的expexted结果,你会发现我的解决方案正是他所需要的。
  • 你怎么知道的?预期结果中的所有数字都不会在 both 列表中出现多次。
【解决方案2】:
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]

print(set(a).intersection(set(b)))
# output {1, 2, 3, 5, 8, 13}

当列表中的元素出现超过 1 次时

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,2]

from collections import defaultdict

dic=defaultdict(int)
dic2=defaultdict(int)

for i in a:
    dic[i]+=1
for i in b:
    dic2[i]+=1

l=list(set(a) & set(b))

solution = [j for i in l for j in [i]*min(dic[i],dic2[i])]
print(solution)
# output [1, 2, 3, 5, 8, 13]

【讨论】:

  • 或使用collections.Counter:[x for x, c in (Counter(a) & Counter(b)).items() for _ in range(c)]
猜你喜欢
  • 2019-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
  • 2013-02-21
  • 1970-01-01
  • 2022-01-01
  • 2021-06-22
相关资源
最近更新 更多