2017-04-23 407 views
0

我有兩個很長的字典列表。我想查找第二個列表中的詞典,它們在第一個詞典列表中包含鍵,並根據另一個鍵將它們分開。列表1中的一些鍵是列表2中的值。Python:在列表中查找包含另一個字典列表的鍵的字典

下面是一個例子:

students = [{'123': [{'course1': 2}, {'course2': 2}]}, 
      {'124': [{'course1': 3}, {'course2': 4}]}, 
      {'125': [{'course1': 24}, {'course2': 12}]}, 
      {'126': [{'course1': 2}, {'course2': 24}]}, ...] 

finals = [{'student_number':'123', 'exam':'passed',...}, 
      {'student_number':'124', 'exam':'ungraded',...}, 
      {'student_number':'125', 'exam':'failed',...}, ...] 

發現在總決賽中存在的學生和他們分開基於「考試」鍵student_numbers:

# Students who passed exam, 'exam' = 'passed' 
passed_students = ['123', ...] 

# Other Students 
other_students = ['124', '125', ...] 

回答

0

我不太確定你的數據是最好的格式,但給你什麼你有以下代碼將工作:

students = [{'123': [{'course1': 2}, {'course2': 2}]}, 
      {'124': [{'course1': 3}, {'course2': 4}]}, 
      {'125': [{'course1': 24}, {'course2': 12}]}, 
      {'126': [{'course1': 2}, {'course2': 24}]}] 

finals = [{'student_number':'123', 'exam':'passed'}, 
      {'student_number':'124', 'exam':'ungraded'}, 
      {'student_number':'125', 'exam':'failed'}] 

studentIDs = [i.keys()[0] for i in students] 

passed_students=[] 
other_students=[] 
for row in finals: 
    snum = row['student_number'] 
    status = row['exam'] 
    if status=='passed' and snum in studentIDs: 
     passed_students.append(snum) 
    elif status!='passed' and snum in studentIDs: 
     other_students.append(snum) 
    else: 
     print 'Student ID {0} not found in list.'.format(snum) 
0

有點ex ercise的列表內涵:

students = [{'123': [{'course1': 2}, {'course2': 2}]}, 
      {'124': [{'course1': 3}, {'course2': 4}]}, 
      {'125': [{'course1': 24}, {'course2': 12}]}, 
      {'126': [{'course1': 2}, {'course2': 24}]}] 

finals = [{'student_number':'123', 'exam':'passed',}, 
      {'student_number':'124', 'exam':'ungraded',}, 
      {'student_number':'125', 'exam':'failed',},] 

# Extract student id numbers. 
student_ids = set(
    student_data.keys()[0] 
    for student_data in students) 

# Restrict finals to the students that exist in students. 
students_with_finals = [ 
    final 
    for final in finals 
    if final['student_number'] in student_ids] 

passed_students = [ 
    final['student_number'] 
    for final in students_with_finals 
    if final['exam'] == 'passed'] 

other_students = [ 
    final['student_number'] 
    for final in students_with_finals 
    if final['exam'] != 'passed'] 

print('Passed students: {}'.format(passed_students)) 
print('Other students: {}'.format(other_students)) 

結果:

Passed students: ['123'] 
Other students: ['124', '125'] 

它看起來像該數據結構可以通過使用字典和學生ID作爲密鑰被簡化:

students = { 
    '123': [{'course1': 2}, {'course2': 2}], 
    '124': [{'course1': 3}, {'course2': 4}], 
    '125': [{'course1': 24}, {'course2': 12}], 
    '126': [{'course1': 2}, {'course2': 24}], 
} 

finals = { 
    '123': {'exam':'passed', 'points': 100}, 
    '124': {'exam':'ungraded'}, 
    '125': {'exam':'failed'}, 
} 
+0

謝謝Helko,你的解決方案比我寫的要好,3嵌套for循環+ 2嵌套if。 –

0
>>> students = {'123':{'name':'Bonnie','course_1':2, 'course_2':2}, 
...    '124':{'name':'Jerry', 'course_1':3, 'course_2':4}, 
...    '125':{'name':'Bob', 'course_1':24, 'course_2':12}, 
...    '126':{'name':'Jill', 'course_1':2, 'course_2':24}} 
>>> finals = [{'num':'123', 'exam':'passed'}, 
...   {'num':'124', 'exam':'ungraded'}, 
...   {'num':'125', 'exam':'failed'}] 
>>> student_results = {'passed':[], 'ungraded':[], 'failed':[]} 
>>> 
>>> for final in finals: 
... student_results[final['exam']].append(students[final['num']]) 
>>>   
>>> # Print student results. 
>>> for result in ['passed', 'ungraded', 'failed']: 
...  print "Students %s:" % result 
...  for student in student_results[result]: 
...   print " " + student['name'] 
... 
Students passed: 
    Bonnie 
Students ungraded: 
    Jerry 
Students failed: 
    Bob   
相關問題