Saya mencoba menggabungkan kamus ke kamus lain. Saya memiliki dua kunci; satu yang unik dan satu lagi yang tidak unik. Saya ingin menggabungkan informasi tentang kunci non-unik dan meninggalkan semua informasi karena itu adalah salah satu kunci unik, yaitu jumlah id unik harus tetap sama.

Adakah ide bagaimana saya bisa mencapai ini?

Ini adalah kamus pertama:

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

Ini adalah kamus kedua:

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

Dan inilah yang saya coba capai:

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)

Memberikan:

([{'id': '1', 'name': 'Peter', 'category_id': '25', 'level': 'advanced'}, 
{'id': '3', 'name': 'Toni', 'category_id': '20', 'level': 'beginner'}])
2
Benjamin Andersen 10 Agustus 2017, 18:50

2 jawaban

Jawaban Terbaik

Buat pemetaan dari category_id ke bidang tambahan, lalu gabungkan kamus dalam satu lingkaran, mis:

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)

Di Python 3.5+ Anda dapat menggunakan sintaks baru yang keren:

cat = {d["category_id"]: d for d in categories}
res = [{**name, **cat[name["category_id"]]} for name in names]
3
Eugene Yarmash 10 Agustus 2017, 15:59

Pertimbangkan apa yang benar-benar ingin Anda lakukan: tambahkan level yang terkait dengan setiap kategori ke dict names. Jadi pertama, buat pemetaan dari kategori ke level terkait:

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

Kemudian transformasi sepele pada setiap dict dalam daftar names:

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

Daftar names yang dihasilkan adalah:

[{'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'}]
1
holdenweb 10 Agustus 2017, 16:10