2017-03-17 7 views
0

したがって、私は約25,000行のデータを照合するためにPythonの中で組み合わせリストを作成しようとしています。2つのファイルを効果的に反復する方法(25000 + Lines)

リストから
Serial|Mac 

Mac 1する必要があります。

最初のリストのデータは、2番目のリストデータはserial.uid来て、このようなファイルのmac.uidから来て、この

Mac|ID 

のように見えます参加する前にリスト2のMacと同じになります。

これは私が現在やっていることですが、繰り返しすぎていると思います。

combined = []; 

def combineData(): 
    lines = open('mac.uid', 'r+') 
    for line in lines: 
     with open('serial.uid', 'r+') as serial: 
      for each in serial: 
       a, b = line.strip().split('|') 
       a = a.lower() 
       x, y = each.strip().split('|') 
       y = y.lower() 
       if a == y: 
        combined.append(a+""+b+""+x) 

最終的なリストは、このように見えるようになっている:私はExcelシートにインポートできるよう

Mac(List1), ID(List1), Serial(List2) 

ありがとうございました!代わりに、あなたはあなたのおおよそO Nログ( N))の複雑さを与える辞書を使用する必要があります(二次複雑さの原因となる)あなたのネストされたループの

+0

メモリに両方のファイルを読み込むことができる場合は、参加を実行するためにパンダを使用します。http://pandas.pydata.org/pandas-docs/stable/merging.html#database-style-dataframe-joining-mergingを参照してください。あなたがデータをどのSQLデータベースにもロードしてそこに参加することができない場合は、(または単にdictsを使用して) –

+0

私は正直なところ、この問題は見当たりません。それは非常に効果的でスケーラブルに見えます。 – pltrdy

+0

これらの値はすべて一意ですか?各Mac | IDには、同じMacを持つシリアル| Macが1つありますか? – tdelaney

答えて

2

。これを行うには、最初にserial.uidに一度読み、シリアル番号にMACアドレスのマッピングをdictに保存します。

serial = dict() 

with open('serial.uid') as istr: 
    for line in istr: 
     (ser, mac) = split_fields(line) 
     serial[mac] = ser 

その後、再度ファイルを閉じることができますし、プロセスmac.uidはあなただけで作成した辞書内の各MACアドレスのシリアル番号を調べます。私はタプルのリストに文字列のリストからcombinedを変更した

combined = list() 

with open('mac.uid') as istr: 
    for line in istr: 
     (mac, uid) = split_fields(line) 
     combined.append((mac, uid, serial[mac])) 

注意。私は分割ロジックを別の関数にも分解しました。 (あなたはもちろん、その使用の前に、その定義を配置する必要があります。)

def split_fields(line): 
    return line.strip().lower().split('|') 

最後に、私はあなたの変数のため、より説明的な名前を使用して起動することをお勧めします。

25k行のファイルの場合、すべてをメモリに保存する必要はありません。データセットがそれ以上に大きくならない場合は、データベースの使用を検討したいことがあります。 Python標準ライブラリには、SQLite moduleが付属しています。

+0

コード例なしで孤独に見えます。 – Jacobr365

+0

@ Jacobr365私は最初にコードを提供することを躊躇しましたが、おそらく正しいでしょう。私は私の答えを修正しました。 – 5gon12eder

+0

@mootmoot不正なコードが含まれているため、編集をロールバックしました。なぜあなたは 'read_line'関数の引数をそのように変更しましたか?私たちが議論できるように、コメントのコード変更を提案していただければ幸いです。あなたが優れた解決策を持っていると思ったら、あなた自身の答えを投稿してください。 – 5gon12eder

関連する問題