2015-12-15 5 views
0

Мне нужно найти способ вернуть 1-е значение внутри ключа «hw» для клавиш 1 и 2 и суммировать их, но я не могу придумать способ. Он должен работать для любого количества ключей , а не только 1 и 2, но даже если их было 10 или около того. 1 и 2 ученики: «hw», «qz» и т. Д. Являются категориями заданий, каждый студент будет иметь hw, qz, ex, pr и будет 3 qz, 3hw, 3pr, 3ex для каждого студент. Мне нужно, чтобы вернуть все студент 1-го, Hw класс, 1 класс викторины, второй grade..etcСловарь с ключами внутри клавиш

HW
grades = { 
     1: { 
      'pr': [18, 15], 
      'hw': [16, 27, 25], 
      'qz': [8, 10, 5], 
      'ex': [83, 93], 
      }, 
     2: { 
      'pr': [20, 18], 
      'hw': [17, 23, 28], 
      'qz': [9, 9, 8], 
      'ex': [84, 98], 
      }, 
     } 
+0

Вы пробовали «Оценки [1] ['hw'] [0] + Grades [2] ['hw'] [0]' еще? –

+0

Да, это работает, но нужно работать на любое количество ключей, а не только на 1 и 2, но даже если их было 10 или около того. –

+0

Та же общая техника будет работать для любого количества ключей. Можете ли вы дать более подробную информацию о своих требованиях и пример, где вы пытались реализовать. – tdelaney

ответ

2

Более лаконично (и Pythonicly):

hw_sum = sum([grades[key]['hw'][0] for key in grades]) 
+0

Более сложный и лаконичный не обязательно больше pythonic .. – RafaelC

+0

технически, вам даже не нужно создавать список – fjarri

+0

Rafael, код выше очень прост для чтения для любого достойного разработчика Python. Список понятий - очень часто используемая особенность языка. И это, оказывается, однострочный, что приятно. – pkout

0

возвращение 1-го значения внутри ключ «hw» для клавиш 1 и 2 и суммировать их

Это помогает использовать пояснительные имена, чтобы мы знали, какими должны быть движущиеся части. Я выбрал описательные имена несколько произвольно, угадывая смысл.

Succinct решение

grades_by_year_and_subject = { 
     1: { 
      'pr': [18, 15], 
      'hw': [16, 27, 25], 
      'qz': [8, 10, 5], 
      'ex': [83, 93], 
      }, 
     2: { 
      'pr': [20, 18], 
      'hw': [17, 23, 28], 
      'qz': [9, 9, 8], 
      'ex': [84, 98], 
      }, 
     } 

sum_of_grades_for_year_1_and_2_for_subject_hw = sum(
     grades[0] for grades in (
      grades_by_subject['hw'] 
      for (year, grades_by_subject) in 
       grades_by_year_and_subject.items() 
      if year in [1, 2] 
      ) 
     ) 

Ломая это на несколько более мелких задач:

Sum коллекцию значений

sum_of_grades = sum(values) 

Получить набор первых значений из коллекции списков

set_of_first_grades = { 
     values[0] for values in collection} 

Сделать генератор значений для ключа 'hw' в каждом Dict из коллекции

generator_of_hw_value_lists = (
     values_dict['hw'] for values_dict in 
     collection_of_dicts.values()) 

Уменьшают словарь только те пункты, с ключами 1 или 2

mapping_of_values_for_key_1_and_2 = { 
     key: value 
     for (key, value) in values_dict.items() 
     if key in [1, 2]} 

VERBOSE раствор

grades_by_year_and_subject = { 
     1: { 
      'pr': [18, 15], 
      'hw': [16, 27, 25], 
      'qz': [8, 10, 5], 
      'ex': [83, 93], 
      }, 
     2: { 
      'pr': [20, 18], 
      'hw': [17, 23, 28], 
      'qz': [9, 9, 8], 
      'ex': [84, 98], 
      }, 
     } 

grades_for_year_1_and_2_by_subject = { 
     year: grades_by_subject 
     for (year, grades_by_subject) in 
      grades_by_year_and_subject.items() 
     if year in [1, 2]} 

grades_for_year_1_and_2_for_subject_hw = (
     grades_by_subject['hw'] 
     for grades_by_subject in 
      grades_for_year_1_and_2_by_subject.values()) 

sum_of_grades_for_year_1_and_2_for_subject_hw = sum(
     grades[0] for grades in grades_for_year_1_and_2_for_subject_hw) 
Смежные вопросы