首页 > 解决方案 > 比较python中的两个列表,只保留匹配项和不匹配项

问题描述

我正在尝试遍历两个元组列表并寻找匹配项。我想生成两个元组列表作为输出:一个包含匹配项(第一个值出现在两个列表中的元组)和一个不匹配(第一个值出现在一个列表中但不在另一个列表中的元组)。

我尝试通过在嵌套循环中迭代两个列表并比较那里的元组来实现这一点。但是,当我这样做时,生成的“不匹配”列表还包含匹配的元组,并且也出现在“匹配”列表中。

我试图避免这种情况。必须有更好的方法来做到这一点。任何帮助,将不胜感激。

下面是一个例子:

data1 = [
    ("Aaden", "3"),
    ("Aamir", "3"),
    ("Aarav", "3"),
    ("aaren", "3"),
    ("aarika", "3"),
    ("Adad", "3")
]

data2 = [
    ("Aaden", "3"),
    ("Aamir", "3"),
    ("Aarav", "3"),
    ("aaren", "3"),
    ("aarika", "3"),
    ("Aaron", "3"),
    ("Abaddon", "3"),
    ("abagael", "3"),
    ("abagail", "3"),
    ("Abatu", "3"),
    ("abbe", "3"),
    ("abbey", "3"),
    ("abbi", "3"),
    ("abbie", "3"),
    ("Abbot", "3"),
    ("Abbott", "3"),
    ("abby", "3"),
    ("abbye", "3"),
    ("Abdel", "3"),
    ("Abdiel", "3"),
    ("Abdul", "3"),
    ("Abdulkarim", "3"),
    ("Abdullah", "3"),
    ("Abduxuel", "3"),
    ("Abe", "3"),
    ("Abel", "3"),
    ("Abelard", "1"),
    ("abigael", "3"),
    ("abigail", "3"),
    ("abigale", "3"),
    ("Abigar", "3"),
    ("Abigor", "3"),
    ("Abner", "4"),
    ("abra", "3"),
    ("Abraham", "3"),
    ("Abram", "3"),
    ("Acacia", "3"),
    ("Ace", "3"),
    ("Achilles", "3"),
    ("Aclahayr", "3"),
    ("ada", "6"),
    ("awdad", "3"),
    ("awad", "3"),
    ("Ainiond", "3"),
    ("Adww", "3"),
    ("james","3")
]

match = []
no_match = []

for item1 in data1:
    for item2 in data2:
        if item1[0] == item2[0]:
            match.append(item1)
        else:
            no_match.append(item1)      

print('First List Count: {}'.format(len(data1)))
print('Second List Count: {}'.format(len(data2)))

print('Match Count: {}'.format(len(match)))
print('No Match Count: {}'.format(len(no_match)))

输出:

First List Count: 6
Second List Count: 46
Match Count: 5
No Match Count: 271

标签: pythonpython-3.x

解决方案


您可能希望为此使用集合。您可以找到两个集合的交集 ( ) 的公共元&组:

match = set(data1) & set(data2)

并且您可以获得具有对称差异或等效的非公共元素^

no_match = len(set(data1) ^ set(data2))

更多关于集合——附加链接中独特元素的无序集合。


推荐阅读