2017-08-30 3 views
2

同じ内容(単語リスト)の2つのテキストファイルから同時に行を読み込んでいます。Pythonの同じ内容の2つのファイルから2行の同一性

peach 
carrot 
apple 
lemon 

2つの同時行が同じかどうかをチェックしたいと思います。そうでない場合、全体の類似性は減少する。 2つのファイルが同一であるため、同一性のチェックは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 

なぜ線が同じではないのですか?

答えて

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 
+0

+コードを簡略化するため –

2

、変更する必要があります:あなたがあるため、同じ文字列のインタプリタの実装のほとんどでis演算子を使用することはできませんPythonでstringオブジェクトを比較すると

if line1 == line2: 

:によって

if((line1 is line2) is False): 

を異なるオブジェクトとして表されるほとんどの時間

isオペレータリターンTrueあなたが比較しているオブジェクトが同じ場合、オブジェクトの値が同じでない場合は、この最後のケースが必要です。同じ値を持ついくつかのインタプリタの実装の文字列リテラルで

は終了し、同じオブジェクトを共有して実装することができ、それは、あなたのスクリプトで信頼すべきものではありません。

'abc' is 'abc' # True in CPython. 

上記の例では完全に実装したものです依存しており、将来変化する可能性があります。不変オブジェクトはオブジェクトIDではなく値で比較する必要があります(つまり、is演算子の場合)。

関連する問題