在列表中查找匹配和不匹配项
我刚开始学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]