Возвращать элементы словаря, если 3 поля суммируются с определенным числом - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть словарь студентов и их оценок, и мне нужно вернуть студентов, у которых

  • есть TP01, TP02 и TP03 сумма выше, чем 30

Вот фиктивный диктант для работы:

{'Name': ['Colin', 'Doyon', 'Tremblay', 'Audry', 'Gamelin', 'Dagenais', 'Legault',
  'Larochelle', 'Gagnon', 'Simard'], 
'FirstName': ['Jonas', 'Elisabeth', 'Françcois', 'Francine', 'Geneviève',
  'Robert', 'Maxime', 'Pierre', 'Emilie', 'Martine'],
 'TP01': ['7', '9.5', '8', '5', '6', '8', '10', '3', '7', '8'],
 'TP02': ['12', '14', '12', '13', '10', '12', '14', '11', '10', '15'],
 'TP03': ['11', '12', '11', '10', '10', '13', '12', '6', '7', '14'],
 'EXAMEN_INTRA': ['22', '26', '20', '22', '20', '23', '27', '15', '13', '28'],
 'EXAMEN_FINAL': ['28', '20', '22', '15', '14', '22', '25', '14', '14', '27']}

К сожалению, я не могу использовать какие-либо библиотеки.

Что я пробовал:

sums = list()
for tp1, tp2, tp3 in zip(dict_etudiants['TP01'], dict_etudiants['TP02'], dict_etudiants['TP03']):
    sums.append(sum((float(tp1), float(tp2), float(tp3)))) # but then it leads nowhere

1 Ответ

2 голосов
/ 04 апреля 2020

Самая большая проблема - ваша структура данных - вы храните значения в отдельных списках, но вся информация об одном ученике должна быть в одном словаре или списке, и тогда это будет намного проще.

Примерно так:

studends = [
  {'Name': 'Colin', 'FirstName': 'Jonas', 'TP01': '7', 'TP02': '12', 'TP03': '11', 'EXAMEN_INTRA': '22', 'EXAMEN_FINAL': '28'},
  {'Name': 'Doyon', 'FirstName': 'Elisabeth', ....},
  ...
]

Этот код получает все результаты с sum > 30, но возвращает каждого учащегося в отдельном списке - поэтому, если вам нужна исходная структура, вам придется преобразовать результат.

dict_etudiants = {
    'Name': ['Colin', 'Doyon', 'Tremblay', 'Audry', 'Gamelin', 'Dagenais', 'Legault',
  'Larochelle', 'Gagnon', 'Simard'], 
    'FirstName': ['Jonas', 'Elisabeth', 'Françcois', 'Francine', 'Geneviève',
  'Robert', 'Maxime', 'Pierre', 'Emilie', 'Martine'],
     'TP01': ['7', '9.5', '8', '5', '6', '8', '10', '3', '7', '8'],
     'TP02': ['12', '14', '12', '13', '10', '12', '14', '11', '10', '15'],
     'TP03': ['11', '12', '11', '10', '10', '13', '12', '6', '7', '14'],
     'EXAMEN_INTRA': ['22', '26', '20', '22', '20', '23', '27', '15', '13', '28'],
     'EXAMEN_FINAL': ['28', '20', '22', '15', '14', '22', '25', '14', '14', '27']
}


students = list()
for tp1, tp2, tp3, name, firstname, examen_intra, examen_final in zip(dict_etudiants['TP01'], dict_etudiants['TP02'], dict_etudiants['TP03'],
                         dict_etudiants['Name'], dict_etudiants['FirstName'], dict_etudiants['EXAMEN_INTRA'], dict_etudiants['EXAMEN_FINAL']):
    if sum((float(tp1), float(tp2), float(tp3))) > 30:
        students.append([name, firstname, tp1, tp2, tp3, examen_intra, examen_final])

print(students)

Результат

[
  ['Doyon', 'Elisabeth', '9.5', '14', '12', '26', '20'],
  ['Tremblay', 'Françcois', '8', '12', '11', '20', '22'], 
  ['Dagenais', 'Robert', '8', '12', '13', '23', '22'], 
  ['Legault', 'Maxime', '10', '14', '12', '27', '25'], 
  ['Simard', 'Martine', '8', '15', '14', '28', '27']
]

РЕДАКТИРОВАТЬ: Я выпустил, что вы можете преобразовать его в pandas.DataFrame, и тогда будет легко искать студентов.

result = df[ df['TP01'] + df['TP02'] + df['TP03'] > 30 ]

Полный код

dict_etudiants = {
    'Name': ['Colin', 'Doyon', 'Tremblay', 'Audry', 'Gamelin', 'Dagenais', 'Legault',
  'Larochelle', 'Gagnon', 'Simard'], 
    'FirstName': ['Jonas', 'Elisabeth', 'Françcois', 'Francine', 'Geneviève',
  'Robert', 'Maxime', 'Pierre', 'Emilie', 'Martine'],
     'TP01': ['7', '9.5', '8', '5', '6', '8', '10', '3', '7', '8'],
     'TP02': ['12', '14', '12', '13', '10', '12', '14', '11', '10', '15'],
     'TP03': ['11', '12', '11', '10', '10', '13', '12', '6', '7', '14'],
     'EXAMEN_INTRA': ['22', '26', '20', '22', '20', '23', '27', '15', '13', '28'],
     'EXAMEN_FINAL': ['28', '20', '22', '15', '14', '22', '25', '14', '14', '27']
}

import pandas as pd
import pprint

# create DateFrame
df = pd.DataFrame(dict_etudiants)

# convert strings to float
df['TP01'] = df['TP01'].astype(float)
df['TP02'] = df['TP02'].astype(float)
df['TP03'] = df['TP03'].astype(float)

# search students
result = df[ df['TP01'] + df['TP02'] + df['TP03'] > 30 ]

# convert back to dictionary
dict_etudiants_selected = result.to_dict(orient='list')

print('\n--- DataFrame ---\n')
print(result)

print('\n--- dict ---\n')
pprint.pprint(dict_etudiants_selected)

Результат

--- DataFrame ---

       Name  FirstName  TP01  TP02  TP03 EXAMEN_INTRA EXAMEN_FINAL
1     Doyon  Elisabeth   9.5  14.0  12.0           26           20
2  Tremblay  Françcois   8.0  12.0  11.0           20           22
5  Dagenais     Robert   8.0  12.0  13.0           23           22
6   Legault     Maxime  10.0  14.0  12.0           27           25
9    Simard    Martine   8.0  15.0  14.0           28           27

--- dict ---

{'EXAMEN_FINAL': ['20', '22', '22', '25', '27'],
 'EXAMEN_INTRA': ['26', '20', '23', '27', '28'],
 'FirstName': ['Elisabeth', 'Françcois', 'Robert', 'Maxime', 'Martine'],
 'Name': ['Doyon', 'Tremblay', 'Dagenais', 'Legault', 'Simard'],
 'TP01': [9.5, 8.0, 8.0, 10.0, 8.0],
 'TP02': [14.0, 12.0, 12.0, 14.0, 15.0],
 'TP03': [12.0, 11.0, 13.0, 12.0, 14.0]}
...