2017-03-17 3 views
1

私は2つのテキストファイルを持っています。 A.TXTでは、このような行(一方万行)がある。pythonは2つの大きいリストを比較し、1つを処理します

991000000019999998,b10000021, 
991000000019703408,b10000021, 
991000545455435408,b10000045, 
991000000029703408,b10000045, 
... 

最初の部分は、バーコード(991000000019703408)であり、第二の部分はbib_number(b10000021)です。 bib_numberは各行で重複している可能性がありますが、バーコードは一意です。だからSet()を使うと大丈夫じゃないと思う。別のファイルB.TXT、のみbib_number(60万記録)についての情報で :

b10000021 
b10000045 
b10000215 
... 

(b10000045のような)eachlineのbib_numberがでない場合は今、私は、A.TXTに、2つのファイルを比較する必要がありますb.txt、この全行は、(991000000029703408、b10000045、)のようにc.txtに出力する必要があります

私はこのようなコードを書いていますが、私は20分までreusltを持っていません。

with open("a.txt", "r") as f1,open("b.txt", "r") as f2,open("c.txt","w") as f3: 
    total_bb=f1.readlines() 
    list_match=f2.readlines() 
    for item_bb in total_bb: 
     recordList=re.split(",",item_bb) 
     item_bb_w=(recordList[1])+'\n' 
     if item_bb_w not in list_match: 
      f3.write(item_bb) 

これらの2つの大きなリストを比較するにはどんなトリックですか? set Sを使用したおかげで

+0

ご注文はお考えですか?単に 'set'sにするだけでなく、' set1 - set2'はあなたにすべての不足数を与えます。 – AChampion

答えて

1

、ルックアップはO(1)です:

with open("a.txt", "r") as f1,open("b.txt", "r") as f2,open("c.txt","w") as f3: 
    bs = set(b.strip() for b in f2) 
    for a in f1: 
     x = a.split(',') 
     if x[1].strip() not in bs: 
      f3.write(a) 

私はまた、カンマ区切り値を読み取るためのcsvモジュールになります。

+0

bib_numberは各行で重複している可能性があることに注意してください。しかし、バーコードはユニークです(私は編集しました)ので、Set()を使うと大丈夫ではないと思います。 SET()は同じ要素を削除します。そして、私はbib_numberだけでなく、行全体を出力する必要があります。ありがとう –

+0

'a'の全体を書き出すように更新されました。 – AChampion

+1

@ AChampionは、x [1] .strip()がbでない場合 "x [1] .strip()がbsでない場合"? – plasmon360

関連する問題