在列表中查找匹配和不匹配项

7 投票
6 回答
29351 浏览
提问于 2025-04-17 10:49

我刚开始学Python,对列表的用法有点困惑。我有两个列表想要比较,想要得到匹配和不匹配的元素,并以二进制格式返回。List1的长度是固定的,而List2的长度不一样(但总是比List1短)。

举个例子:

List1 = ['dog', 'cat', 'pig', 'donkey']
List2 = ['dog', 'cat', 'donkey']

我想要的输出:

List3 = [1, 1, 0, 1]

我目前写的代码是:

def match_nonmatch(List1, List2):
    List3 = []
    for i in range(len(List1)):
        for j in range(len(List2)):
            if List1[i] == List2[j]:
                List3.append(1)
            else:
                List3.append(0)
   return List3

我能返回匹配的元素,但当我加上上面提到的else语句来返回不匹配的元素时,结果的列表长度远远超过了预期。例如,当我用一个包含60个元素的列表进行比较时,得到的列表竟然有3600个元素,而不是60个。

如果有人能帮我解释一下我现在代码的问题,并建议我如何修改代码以达到我想要的效果,我会非常感激。

6 个回答

5

你也可以使用位运算:

List1 = ['dog', 'cat', 'pig', 'donkey']  
List2 = ['dog', 'cat', 'donkey']  

匹配的情况:

set(List1) & set(List2)   

不匹配的情况:

set(List1) ^ set(List2) 
22

set 代替 list。这样你可以做很多很不错的事情:

set1 = set(['dog', 'cat', 'pig', 'donkey'])
set2 = set(['dog', 'cat', 'donkey'])

matched = set1.intersection(set2) # set(['dog', 'cat', 'donkey'])
unmatched = set1.symmetric_difference(set2) # set(['pig'])

我知道这不是你问的具体内容,但通常在做这种事情时,使用集合(set)比使用列表(list)更好。

关于集合的更多信息可以在这里找到: http://docs.python.org/library/stdtypes.html#set

10

使用下面的代码。

listt3=[]

for i in listt1:
    if i in listt2:
        listt3.append(1)
    else:
        listt3.append(0)

如果你喜欢一行代码的写法,

listt3=[ 1 if i in listt2 else 0 for i in listt1]

撰写回答