2017-08-10 2 views
2

Ich versuche, ein Wörterbuch zu einem anderen Wörterbuch zu verbinden. Ich habe zwei Schlüssel; eine, die einzigartig ist und eine andere, die nicht einzigartig ist. Ich möchte Informationen über den nicht eindeutigen Schlüssel verknüpfen und alle Informationen belassen, da es sich um einen eindeutigen Schlüssel handelt, d. H. Die Anzahl eindeutiger IDs muss gleich bleiben.Join auf nicht-eindeutige zweite ID - Python

Irgendwelche Ideen, wie ich das erreichen kann?

Dies ist das erste Wörterbuch:

names = [ 
    {'id': '1', 'name': 'Peter', 'category_id': '25'}, 
    {'id': '2', 'name': 'Jim', 'category_id': '20'}, 
    {'id': '3', 'name': 'Toni', 'category_id': '20'} 
] 

Dies ist das zweite Wörterbuch:

categories = [ 
    {'category_id': '25', 'level': 'advanced'}, 
    {'category_id': '20', 'level': 'beginner'} 
] 

Und das ist, was ich versuche zu erreichen:

all = [ 
    {'id': '1', 'name': 'Peter', 'category_id': '25', 'level': 'advanced'}, 
    {'id': '2', 'name': 'Jim', 'category_id': '20', 'level': 'beginner'}, 
    {'id': '3', 'name': 'Toni', 'category_id': '20', 'level': 'beginner'} 
] 

EDIT:

names = [ 
    {'id': '1', 'name': 'Peter', 'category_id': '25'}, 
    {'id': '2', 'name': 'Jim', 'category_id': '20'}, 
    {'id': '3', 'name': 'Toni', 'category_id': '20'} 
] 

categories = [ 
    {'category_id': '25', 'level': 'advanced'}, 
    {'category_id': '20', 'level': 'beginner'} 
] 

def merge_lists(l1, l2, key): 
    merged = {} 
    for item in l1+l2: 
     if item[key] in merged: 
      merged[item[key]].update(item) 
     else: 
      merged[item[key]] = item 
    return merged.values() 

courses = merge_lists(names, categories, 'category_id') 
print(courses) 

gibt:

([{'id': '1', 'name': 'Peter', 'category_id': '25', 'level': 'advanced'}, 
{'id': '3', 'name': 'Toni', 'category_id': '20', 'level': 'beginner'}]) 
+0

Jede Anstrengung von Ihrer Seite? Was hast du bisher versucht? SO ist kein Kodierungsdienst. Als Ausgangspunkt, warum schleifen Sie nicht über das zweite Wörterbuch –

+0

Ihre Beschreibung ist ein wenig verwirrend. Sie haben nicht zwei Wörterbücher: Sie haben zwei Listen von Wörterbüchern. Sie könnten jedoch den Code effizienter machen, indem Sie ein Wörterbuch aus 'categories' mit dem Wert category_id als Schlüssel und der zugehörigen Ebene als Wert erstellen. –

+0

Ihre Daten sind bei weitem nicht optimal strukturiert für die Transformation, die Sie erreichen möchten. Denken Sie also darüber nach, welche Struktur das Problem erleichtern würde, und versuchen Sie dann, Ihre bestehende Struktur zu transformieren. – holdenweb

Antwort

3

Erstellen Sie eine Zuordnung von category_id zu den zusätzlichen Bereich (e), dann verbinden die Wörterbücher in einer Schleife, zB:

cat = {d["category_id"]: d for d in categories} 
res = [] 

for name in names: 
    x = name.copy() 
    x.update(cat[name["category_id"]]) 
    res.append(x) 

In Python 3.5 und höher Sie die verwenden können, cool neue Syntax:

+0

danke. Schätze deine Antwort wirklich! –

1

Überlegen Sie, was Sie wirklich tun möchten: Fügen Sie die Ebene, die mit jeder Kategorie verbunden ist, hinzu names dict. So Erstellen Sie zunächst eine Zuordnung aus den Kategorien mit den zugehörigen Ebenen:

cat_dict = {d['category_id']: d['level'] for d in categories} 

Es ist dann eine triviale Transformation auf jedem dict in der names Liste:

for d in names: 
    d['level'] = cat_dict[d['category_id']] 

Die resultierende names Liste ist:

[{'category_id': '25', 'id': '1', 'level': 'advanced', 'name': 'Peter'}, 
{'category_id': '20', 'id': '2', 'level': 'beginner', 'name': 'Jim'}, 
{'category_id': '20', 'id': '3', 'level': 'beginner', 'name': 'Toni'}]