我同时从两个具有相同内容(单词列表)的文本文件中读取行。
peach
carrot
apple
lemon
我想检查两条同时行是否相同。如果不是,则总相似度降低。由于这两个文件是相同的,因此检查身份应该导致100%的相似性。相反,我得到0%。
from itertools import izip, izip_longest
with open(r'file1.txt', "rb") as f1, open(r'file2.txt', "rb") as f2:
#initialize numerator & denominator values for calculating file similarity
nTotal = 4 #total number of lines in each file
nIdent = nTotal
for line1, line2 in izip_longest(f1, f2):
if((line1 is line2) is False):
nIdent -=1
similarity = nIdent/nTotal
为什么线条不相同?
答案 0 :(得分:4)
您的比较line1 is line2
不与line1 == line2
相同。对象不相同,但它们代表的数据是。
equal_lines = 0
with open(r'file1.txt', "rb") as f, open(r'file2.txt', "rb") as f2:
for f1_line, f2_line in zip(f.readlines(), f2.readlines()):
if f1_line == f2_line:
equal_lines += 1
答案 1 :(得分:2)
你必须改变:
if((line1 is line2) is False):
由:
if line1 == line2:
当您在Python中比较string
个对象时,您无法使用is
运算符,因为在大多数解释器实现中,相同的字符串表示为不同的对象大部分时间强>
is
运算符返回True
,而不是对象的值是相同的,这是你需要的最后一种情况。
在某些解释器实现中,具有相同值的字符串可以在共享相同对象的情况下结束实现,但这不是您应该信任的脚本:
'abc' is 'abc' # True in CPython.
以上示例完全依赖于实现,将来可能会有所不同。您应该通过其值来比较不可变对象,而不是它的对象id(即is
运算符所做的那样)。