我对Python很陌生,并且对于你能做什么和不能用列表做些什么感到困惑.我有两个要比较的列表,并以二进制格式返回匹配和非匹配元素.List1长度恒定,而长度List2不同(但总是短于List1).
例如:
List1 = ['dog', 'cat', 'pig', 'donkey']
List2 = ['dog', 'cat', 'donkey']
Run Code Online (Sandbox Code Playgroud)
需要输出:
List3 = [1, 1, 0, 1]
Run Code Online (Sandbox Code Playgroud)
我到目前为止的代码是:
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
Run Code Online (Sandbox Code Playgroud)
我可以在比较列表时返回匹配项,但是当我包含上面显示的else语句以返回不匹配时,我最终会得到一个比它应该更长的列表.例如,当我使用比较60个项目的列表时,我得到一个包含3600个项目而不是60个项目的列表.
我很感激,如果有人可以向我解释我的代码目前的问题,并建议我如何修改代码,以便它做我想要的.
Dor*_*mer 18
用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'])
Run Code Online (Sandbox Code Playgroud)
我知道这并不是你要求的,但在做这类事情时,通常使用集合代替列表是一种更好的做法.
更多关于集合:http://docs.python.org/library/stdtypes.html#set
使用以下代码.
listt3=[]
for i in listt1:
if i in listt2:
listt3.append(1)
else:
listt3.append(0)
Run Code Online (Sandbox Code Playgroud)
如果你喜欢单行,
listt3=[ 1 if i in listt2 else 0 for i in listt1]
小智 5
您也可以使用按位运算:
List1 = ['dog', 'cat', 'pig', 'donkey']
List2 = ['dog', 'cat', 'donkey']
Run Code Online (Sandbox Code Playgroud)
匹配:
set(List1) & set(List2)
Run Code Online (Sandbox Code Playgroud)
不匹配:
set(List1) ^ set(List2)
Run Code Online (Sandbox Code Playgroud)