2010-08-06 33 views
9

listelerini birleştirme:Nasıl aşağıdaki gibi sözlüklerin listeleri ile sözlükleri

user_course_information = [ 
    {'course_id': 1456, 'score': 56, 'name': 'History'}, 
    {'course_id': 316, 'score': 71, 'name': 'Science'}, 
    {'course_id': 926, 'name': 'Geography'} # Note: the student did not take this test 
] 

Yoksa olur:

sözlüklerin aşağıdaki listeden bunları birleştirmek için en iyi yolu nedir
user_course_score = [ 
    {'course_id': 1456, 'score': 56}, 
    {'course_id': 316, 'score': 71} 
] 
courses = [ 
    {'course_id': 1456, 'name': 'History'}, 
    {'course_id': 316, 'name': 'Science'}, 
    {'course_id': 926, 'name': 'Geography'} 
] 

Verileri farklı şekilde depolamak daha iyi, örneğin:

courses = { 
    '1456': 'History', 
    '316': 'Science', 
    '926': 'Geography' 
} 

Yardımlarınız için teşekkür ederiz.

+0

. Diğer cevaplar - verileri sözlük olarak yeniden yapılandıracağım - iyi çalışıyor, ancak projem için kimlikleri anahtar olarak kullanmamayı tercih ediyorum. – Chris

cevap

17

İşte olası bir çözüm: Eğer o kullanıcı başına veri depolamak için böyle bir şey yapabileceğini

[{'course_id': 1456, 'name': 'History', 'score': 56}, 
{'course_id': 316, 'name': 'Science', 'score': 71}, 
{'course_id': 926, 'name': 'Geography'}] 

Gördüğünüz gibi, benim kullandığım bir sözlük ('birleştirildi') bir yarı yol noktası olarak. Elbette verilerinizi farklı şekilde depolayarak bir adımı atlayabilirsiniz, ancak bu değişkenler için sahip olabileceğiniz diğer kullanımlara da bağlıdır.

En iyisi. Şunu da deneyebilirsiniz

+0

Mükemmel. Çok teşekkürler. – Chris

+0

Hey Adam. Ben aynı şeyi gerçekleştirmek için bu yöntemi kullanıyorum ama benim dicts ve listeleri çok büyük. Bunu yapmanın daha hızlı bir yolunu biliyor musun diye merak ediyorum. Teşekkürler. –

3

sözlük, temel olarak (anahtar, değer) çiftlerinin bir listesidir. senin durumunda

,

user_course_score sadece (course_id, skor) bir sözlük olabilir ziyade sözlükler listesi

benzer

, ders sadece bir sözlük olabilir (sadece gereksiz yere karmaşık hale) arasında (course_id, isim) Eğer sonunda önerilen ne

doğru yolu :)

2

Rahul doğru olduğu; sözlüklerin bir listesi bunu yapmak için doğru yol değildir. Bunu şöyle düşünün: sözlükler veri parçaları arasındaki eşlemelerdir. Son örneğiniz, courses, verileri depolamanın doğru yolu;

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(user_course_score, courses, 'course_id') 

üretir:

courses = { 
    1456: 'History', 
    316: 'Science', 
    926: 'Geography' 
} # Note the lack of quotes 

test_scores = { 
    1456: { <user-id>: <score on History test> }, 
    316: { <user-id>: <score on History test> }, 
    926: { <user-id>: <score on History test> } 
} 
0

:

[ 
    course.update(score) for course 
    in courses for score in user_course_score 
    if course['course_id'] == score['course_id'] 
] 

:)

ben gerektiren tam olarak ne yaptığı gibi ben Adem'in cevabı kabul etmiş
İlgili konular