2016-03-23 7 views
1

私は辞書の3つのリスト、A、BおよびCの彼らは次のようになります:辞書リストをAリストにマッチさせて、リストBをリストBに、PythonのAとCの共通のプロパティを持つリストBにしますか?

A = [{propA1: valueA1}, {propA1: valueA2}, ...] 
B = [{propB1: valueB1, propB2: valueB2}, {propB1: valueB3, propB2: value4}, ...] 
C = [{propC1: valueC1}, {propC1: valueC2}, ...] 

propA1propB1propB2propC1が同様に同じ性質で、同じ性質が異なる名前です。しかし 、propA1propB1は常に同じ値を持っていないが、私は、配列[valueA1, valueA2, ...][valueB1, valueB2, ...]の「設定交差」で唯一興味を持って、ここでの目標は次のとおりです。私はBなどからすべてのpropB2を返すようにしたいという彼らのpropB1対応(同じ辞書にある)は、AのpropA1と一致します。と一致するように設定されたpropC1は、Cとなります。私が試してみました何

:このループの終わりに

propB2_match = set() 
for elementB in B: 
    for elementA in A: 
     if elementB['propB1'] == elementA['propA1']: 
      propB2_match(elementB['propB2'])    
      break 

は、私がpropC1と一致するために使用できるpropB2のすべてを含むpropB2_match持っています。 しかし、ループからわかるように、これは高価なO(n^2)ループです。 O(n)でこれを処理する方法があるのでしょうか?そうでない場合は、pythonの最適化を行うことができますか?

注:データベースに配置し、リレーショナルデータベースSQLを使用して結合操作を処理する必要はありません。

+0

太字のセクションをもう一度読むことはできますか?propB1がpropB1と一致するようにprobA1(通知pr opとprob)、あなたが以前に言ったことを与えて、なぜvalueB2とvalueB1が再評価されるのでしょうか? – PyNEwbie

+0

基本的には "join"を実装することができます。 'valueA1'を要素' {propA1:valueA1} 'にマッピングする新しいdict A 'を作成し、' valueB1'を要素{{propB1:valueB1、propB2:valueB2} 'にマッピングする新しいdict B'を作成し、結果に 'itertools.groupBy'があります。 – spiffman

+0

@PyNEwbie私の質問が更新されました。 –

答えて

0

私が正しく理解していれば、基本的にはAとBの列[[propA1 '] == B [' propB1 ']のところでJOINを実行しようとしています。あなたにdictsの各リストをマージすることができ、この時点で

[{'pA1': 'vA2'}] 
[{'pB1': 'vB3', 'pB2': 'v4'}] 
[{'pA1': 'vA1'}, {'pB1': 'vA1', 'pB2': 'vB2'}] 

from collections import defaultdict 

A = [{'pA1': 'vA1'}, {'pA1': 'vA2'}] 
B = [{'pB1': 'vA1', 'pB2': 'vB2'}, {'pB1': 'vB3', 'pB2': 'v4'}] 

# Key by the value you want to group on 
kA = [(x['pA1'],x) for x in A] 
kB = [(x['pB1'],x) for x in B] 

# Combine the lists 
kAB = kA+kB 

# Map each unique key to a list of elements that have that key 
results = defaultdict(list) 
for x in kAB: 
    results[x[0]].append(x[1]) 

for x in results: 
    print results[x] 

出力:

は、ここでOだdefaultdict(LEN(A)+ LEN(B))を使って片道です1つの辞書や必要なものをすべて削除し、その結果を3番目のリストCでJOINに使用します。

関連する問題