在python中查找两个列表之间的公共项

时间:2013-07-11 19:58:39

标签: python python-3.x

嘿伙计我在过去的测试问题上需要帮助。基本上我给了两个对象列表,我想要找到出现在第一个列表和第二个列表的相同位置的项目数。我有一个提供的例子。

>>> commons(['a', 'b', 'c', 'd'], ['a', 'x', 'b', 'd'])
2
>>> commons(['a', 'b', 'c', 'd', 'e'], ['a', 'x', 'b', 'd'])
2

我在编写代码时遇到了麻烦。我们的班级正在使用python 3.我不知道从哪里开始写这篇文章。这是一年级的编程课程,我从未在生活中编程。

3 个答案:

答案 0 :(得分:3)

我认为更直接的解决方案是:

def commons(L1,L2):
    return len([x for x in zip(L1,L2) if x[0]==x[1]])

答案 1 :(得分:1)

这对初学者来说不是一个简单的问题。更直接的方法是使用像sumzip这样的函数和列表推导,如下所示:

def commons(L1, L2):
    return  sum(el1 == el2 * 1 for el1, el2 in zip(L1, L2))

初学者采用的更典型但容易出错的方法是:

def commons(L1, L2):
    count = 0
    for i, elem in enumerate(L2):
        if elem == L1[i]:
            count += 1
    return count

我说这更容易出错,因为有更多的部分可以做对。

不使用enumerate即可:

def commons(L1, L2):
    count = 0
    for i, range(len(L2)):
        if L1[i] == L2[i]:
            count += 1
    return count

但前两个仅在len(L2) <= len(L1)时才有效。通过更容易出错来了解我的意思?要解决此问题,您需要执行以下操作:

def commons(L1, L2):
    count = 0
    for i, range(min(len(L2), len(L1))):
        if L1[i] == L2[i]:
            count += 1
    return count

答案 2 :(得分:0)

似乎这样可行:

def commons(l1, l2):
   return sum(1 for v1,v2 in map(None, l1,l2) if v1 == v2)
  • 注意:此处使用的简并形式的映射导致在较短列表中的所有值都返回None(因此即使l1和l2的长度不同,它也会起作用。)它假定两个列表都有值(即L1和L2不包含None - 因为如果一个列表比另一个列表短,那么最终会出现误报。)