2016-03-24 25 views
2

Sözlük (person_profile) sözlüğünü yeni bir sözlük sözlüğüne (person_info) kopyalamaya çalışıyorum çünkü iki farklı sözlükleri (person_profile ve person_attribute, person_info içine) birleştirmeye çalışıyorum. ve anahtar değeri. Ancak yöntemin yukarıdaSözlük Python'un Oluşturulmasını Oluştur

for person in person_profile: 
    person_info.update({ 
     person.id : 
     {'name' : person.name, 'age' : person.age} 
    }) 

# And call person_attribute again 
for person in person_attribute: 
    person_info.update({ 
     person.id : 
     {'occupation' : person.occupation, 'gender' : person.gender} 
    }) 

bir yerine sözlüğe kümesi oluşturmak gibi görünüyor: Aşağıda benim kodu (Sadece daha basit ses yapmak değişken değişti) bulunmaktadır. Diğer makalelerde bunu nasıl yapacağımı bulamadım. Bu problem için önerilen yaklaşım nedir?

== Aslında onları birleştirme yerine listedeki her kişi için person.occupation ve person.gender ile person.name ve person.age değiştiriyorsanız

for person in person_profile: 
    person_info[person.id] = {'name' : person.name, 'age' : person.age} 

for person in person_attribute: 
    person_info[person.id].update({ 
     'occupation' : person.occupation, 'gender' : person.gender 
    }) 
+1

Kodunuz bir küme oluşturmuyor, no. Bu *, her zaman, ikinci döngüde "person.id" anahtar sözcüğünü değiştirerek. –

+0

Lütfen bize "örnek_info" için bir başlangıç ​​değeri ve "person_profile" ve "person_attribute" listeleri için bir başlangıç ​​değeri) ve beklenen "person_info" çıktısı verin. –

+0

Ayrıca bize sahip olduğunuz gerçek çıktıyı da gösterin. –

cevap

1

YANITLANAN.

Kodunuzdaki dayanarak, bir sözlükte bu özelliklerin her ikisi koymak amacıyla aşağıdakileri:

>>> import collections 
>>> person_info = collections.defaultdict(dict) 

>>> for person in person_profile: 
...  person_info[person.id].update({'name': person.name, 'age': person.age}) 

>>> for person in person_attribute: 
...  person_info[person.id].update({'occupation': person.occupation, 'gender': person.gender}) 
+0

Bu yanıt, sözlük güncelleştirmesinin ilk yinelemesi için (person_profile), person_info [person.id] (person_info [person.id] = {'name': person.name, 'age') için bir sözlük atamak zorunda kaldım. : person.age}) sözlük tanımlanmamışsa. Yine de teşekkürler! – seokhoonlee

+0

@seokhoonlee Bunu yapmak zorunda değilsiniz. 'defaultdict' zaten bir anahtarın arkasındaki eksik anahtar için boş bir sözlük oluşturur ve 'KeyError' istisnasını asla bulamayacağınız zaman 'person_info' içine yerleştirir. Baskı (person_info ["lorem ipsum"]) 'gibi bir şey deneyin ve ne olduğunu görün. – ozgur

+0

Ah, sadece sözlüğü başlattığını sanmıştım. Teşekkürler ton! – seokhoonlee

1

Ben ne yapmak istiyorum şu olduğunu varsayalım. Kodunuz set gibi çalışmıyor, ancak person_id eşleştiğinde dict diğer dict ile eşleşiyor.

class Person: 
    def __init__(self, id, name, age, occupation, gender): 
     self.id = id 
     self.name = name 
     self.age = age 
     self.occupation = occupation 
     self.gender = gender 


person_info = dict() 
person_profile = [Person(1, 'Jack', 17, '---', '---'), Person(2, 'Jane', 19, '---', '---')] 
for person in person_profile: 
    person_info.update({ 
     person.id : 
     {'name' : person.name, 'age' : person.age} 
    }) 

person_attribute = [Person(1, '---', '---', 'Senetor', 'Male'), Person(2, '---', '---', 'Nurse', 'Female')] 
for person in person_attribute: 
    data = person_info.get(person.id) 
    attribute_dict = {'occupation' : person.occupation, 'gender' : person.gender} 

    if data: 
     data.update(attribute_dict) 
    else: 
     data = attribute_dict 
print(person_info)