2016-03-23 13 views
1

Sözlüklerden üç listeleri var, A, B ve C GörünüĢüne:A sözlükleri listesi A ile Python'da A ve C'nin ortak özelliklerine sahip olan B listesinin C listesi ile mi eşleştiriliyor?

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

propA1 ve propB1propB2 ve propC1 de aynı özellikleri olan, aynı özellikleri, ancak farklı adıdır. Ancak , propA1 ve propB1 hep aynı değerleri yok ama dizide [valueA1, valueA2, ...] ve [valueB1, valueB2, ...] ait "set kesişme" sadece ilgileniyorum, burada hedeftir: Ben B böyle tüm propB2 dönmek istiyorum onların propB1 muadili (Aynı sözlükte) A. propA1 ile eşleşir. Sonra C içinde propC1 ile eşleşecek şekilde kullanacağım. Ben denedim ne

: Bu döngünün sonunda

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

, ben propC1 ile eşleştirmek için kullanabileceğiniz propB2 tümünü içeren propB2_match var. Ancak, döngüden görebileceğiniz gibi, bu pahalı bir O(n^2) döngüdür. Bunu, O(n) ile halletmenin bir yolu olup olmadığını merak ediyorum? Değilse, üzerinde herhangi bir pythonic optimizasyon yapılabilir mi?

Not: Bir veritabanına koymak ve birleştirme işlemek için ilişkisel veritabanı SQL kullanmak istemiyorum.

+0

Bölümü tekrar kalınca okuyabiliyorsunuz, bu propB2'nin propB1'inin tümüyle eşleşmesini istediğinizi belirttiğinizden net değil. probA1 (bildirim pr op ve prob) ve daha önce söylediklerini verdikten sonra neden B2 değeri ve valueB1 değeri ele alınacak? – PyNEwbie

+0

Temel olarak "birleştirme" uygulayabilirsiniz. Yeni bir Dict A 'değeri' bir elemente '{propA1: valueA1}' eşleştiren A 've' valueB1 'öğesini bir öğeye' {propB1: valueB1, propB2: valueB2} 'eşleyen yeni bir D 'B' ve sonra kullan 'itertools.groupBy 'sonuçlarına – spiffman

+0

@PyNEwbie sorumu güncelledim. –

cevap

0

Doğru bir şekilde anlıyorsam, A ve B sütunlarında A ['propA1'] == B ['propB1'] sütunlarını esas alarak bir JOIN yapmak zorundasınız. İçine dicts her listesini birleştirebilir Bu noktada

[{'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] 

Çıkışlar:

İşte O var defaultdict (len (A) + len (B)) kullanılarak tek yönlü bulunuyor Tek bir dict veya neye ihtiyacınız varsa ve sonucu üçüncü listeyle birlikte JOIN'e kullanın.

İlgili konular