2017-10-27 10 views
3
を削除

私は、各行の言葉でプレーンテキストファイルがあります。は、Pythonは、重複した名前

3210 <DOCID>GH950102-000003<DOCID>/O 
    3243 Australia/LOCATION 
    3360 England/LOCATION 
    3414 India/LOCATION 
    3474 Melbourne/LOCATION 
    3497 England/LOCATION 
    3521 >India<TOPONYM>/O 
    3526 >Zimbabwe<TOPONYM>/O 
    3531 >England<TOPONYM>/O 
    3536 >Melbourne<TOPONYM>/O 
    3541 >England<TOPONYM>/O 
    3546 >England<TOPONYM>/O 
    3551 >Glasgow<TOPONYM>/O 
    3556 >England<TOPONYM>/O 
    3561 >England<TOPONYM>/O 
    3566 >Australia<TOPONYM>/O 
3568 <DOCID>GH950102-000004<DOCID>/O 
    3739 Hampden/LOCATION 
    3821 Hampden/LOCATION 
    3838 Ibrox/LOCATION 
    3861 Neerday/LOCATION 
    4161 Fir Park/LOCATION 
    4229 Park<TOPONYM>/O 
    4234 >Hampden<TOPONYM>/O 
    4239 >Hampden<TOPONYM>/O 
    4244 >Midfield<TOPONYM>/O 
    4249 >Glasgow<TOPONYM>/O 
    4251 <DOCID>GH950102-000005<DOCID>/O 
    4535 Edinburgh/LOCATION 
    4840 Road<TOPONYM>/O 
    4845 >Edinburgh<TOPONYM>/O 
    4850 >Glasgow<TOPONYM>/O`` 

が、私はこのリストに同じ場所の名前を削除すると、それは次のようになります。

3210 <DOCID>GH950102-000003<DOCID>/O 
    3243 Australia/LOCATION 
    3360 England/LOCATION 
    3414 India/LOCATION 
    3474 Melbourne/LOCATION 
    3497 England/LOCATION 
    3526 >Zimbabwe<TOPONYM>/O 
    3551 >Glasgow<TOPONYM>/O 
3568 <DOCID>GH950102-000004<DOCID>/O 
    3739 Hampden/LOCATION 
    3838 Ibrox/LOCATION 
    3861 Neerday/LOCATION 
    4161 Fir Park/LOCATION 
    4229 Park<TOPONYM>/O 
    4244 >Midfield<TOPONYM>/O 
    4249 >Glasgow<TOPONYM>/O 
    4251 <DOCID>GH950102-000005<DOCID>/O 
    4535 Edinburgh/LOCATION 
    4840 Road<TOPONYM>/O 
    4850 >Glasgow<TOPONYM>/O 

Iを重複した場所の名前を削除して、docidをファイル内に残す必要があります。私はユニークを使用しているLinuxを介して方法があることを知っているが、私はそれを別のdocid内の場所を削除します実行する場合。 ロケーション名が同じであれば、重複する名前を削除する必要がある場合は、すべてのdocidとdocid内で分割する必要がありますか?

+0

1つのdocid内にある場所の元の順序を保持する必要がありますが、どの場所が残っているか気にしますか? – Gnudiff

+0

docid内のロケーションの元の注文は必要ありません。私はちょうど1つのdocid内の場所がタグまたはタグ/場所で場所名を持つ場所名を削除するか、重複してはいけません。 – Moizzy

+0

これは、あなたの期待している結果では、最初のdocidに2つのイングランドがあることがわかります。そうですか? – Gnudiff

答えて

2

これを行う方法があります。

import string 
filename = 'testfile' 
lines = tuple(open(filename, 'r')) 

final_list = [] 
unique_list = [] # this resets itself every docid 
for line in lines: 
    currentline = str(line) 
    if 'DOCID' in currentline: 
     unique_list = [] # this resets itself every docid 
     final_list.append(line) 
    else: 
     exclude = set(string.punctuation) 
     currentline = ''.join(ch if ch not in exclude else " " for ch in currentline) 
     city = currentline.split()[1] 
     if city not in unique_list: 
      unique_list.append(city) 
      final_list.append(line) 

for line in final_list: 
    print(line) 

出力:

3210 <DOCID>GH950102-000003<DOCID>/O 

    3243 Australia/LOCATION 

    3360 England/LOCATION 

    3414 India/LOCATION 

    3474 Melbourne/LOCATION 

    3526 >Zimbabwe<TOPONYM>/O 

    3551 >Glasgow<TOPONYM>/O 

3568 <DOCID>GH950102-000004<DOCID>/O 

    3739 Hampden/LOCATION 

    3838 Ibrox/LOCATION 

    3861 Neerday/LOCATION 

    4161 Fir Park/LOCATION 

    4229 Park<TOPONYM>/O 

    4244 >Midfield<TOPONYM>/O 

    4249 >Glasgow<TOPONYM>/O 

    4251 <DOCID>GH950102-000005<DOCID>/O 

    4535 Edinburgh/LOCATION 

    4840 Road<TOPONYM>/O 

    4850 >Glasgow<TOPONYM>/O`` 

注:testfileは、あなたの入力テキストを持つテキストファイルです。必要に応じてコードを最適化することができます。

+0

それは働いた!完璧。ありがとう – Moizzy

3

私は携帯から書いていますので、これは完全な解決策ではありませんが、キーポイント:

import re 
Docid=re.compile("^ *\d+ +<DOCID>") 
Location=re.compile("^ *\d +>?(. +)/") 
Lines={} 
for line in file: 
    if re.match(Docid,line): 
     Lines={} 
     print line 
    else: 
     loc=re.findall(Location, line)[0] 
     if loc not in Lines.keys(): 
      print line 
      Lines[loc] = True 

基本的に、それはそれの各行が新しいDOCIDではありませんがチェックされます。そうでない場合は、場所を読み込み、すでに読み込まれているかどうかを確認します。そうでない場合は、位置を印刷し、それを場所のリストに追加します。

新しいdocidがある場合、最後の読み取り場所がリセットされます。

+0

それは働いた!完璧。ありがとう – Moizzy

関連する問題