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

时间:2012-01-22 11:21:06

标签: python

我对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 个答案:

答案 0 :(得分:16)

使用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'])

我知道这并不是你要求的,但在做这类事情时,使用集合代替列表通常是一种更好的做法。

详情请点击此处:http://docs.python.org/library/stdtypes.html#set

答案 1 :(得分:6)

使用以下代码。

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]

答案 2 :(得分:4)

如果list2很短,我就会这样做:

list1 = ['dog', 'cat', 'pig', 'donkey']
list2 = ['dog', 'cat', 'donkey']
list3 = [int(val in list2) for val in list1]
print(list3)

打印:

[1, 1, 0, 1]

如果list2很长,您可以先将其转换为set,以提高代码效率:

list1 = ['dog', 'cat', 'pig', 'donkey']
set2 = set(['dog', 'cat', 'donkey'])
list3 = [int(val in set2) for val in list1]
print(list3)

当前代码生成太多元素的原因是您在内部循环的每次迭代中调用append(),并且有len(List1) * len(List2)次迭代。

以下是如何解决的问题:

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)
                break             # fix #1
        else:                     # fix #2
            List3.append(0)
    return List3

请注意添加的break以及else子句现在引用内部for而不是if的事实。

那就是说,我仍然会在答案的顶部使用单行代码。

答案 3 :(得分:2)

您也可以使用按位操作:

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

匹配:

set(List1) & set(List2)   

不匹配:

set(List1) ^ set(List2) 

答案 4 :(得分:0)

>>> list1 = ['dog', 'cat', 'pig', 'donkey']; list2 = ['dog', 'cat', 'donkey']
>>> [i in list2 for i in list1]
[True, True, False, True]

此外,您应该阅读PEP8,CamelCase名称通常仅用于类。

答案 5 :(得分:0)

[int(i==j) for i, j in zip(list1, list2)]