Python 如果3个字段的总和为某个数字,则返回字典项
我有一本关于学生及其成绩的词典,我需要返回Python 如果3个字段的总和为某个数字,则返回字典项,python,dictionary,Python,Dictionary,我有一本关于学生及其成绩的词典,我需要返回 TP01、TP02和TP03总和大于30 下面是一个模拟口述: {'Name': ['Colin', 'Doyon', 'Tremblay', 'Audry', 'Gamelin', 'Dagenais', 'Legault', 'Larochelle', 'Gagnon', 'Simard'], 'FirstName': ['Jonas', 'Elisabeth', 'Françcois', 'Francine', 'Geneviève',
、TP01
和TP02
总和大于30TP03
{'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
最大的问题是您的数据结构-您将值保存在单独的列表中,但是关于单个学生的所有信息都应该保存在单个字典或列表中,这样做会更容易 大概是这样的:
studends = [
{'Name': 'Colin', 'FirstName': 'Jonas', 'TP01': '7', 'TP02': '12', 'TP03': '11', 'EXAMEN_INTRA': '22', 'EXAMEN_FINAL': '28'},
{'Name': 'Doyon', 'FirstName': 'Elisabeth', ....},
...
]
此代码使用
sum>30获取所有studends,但它会返回单独列表中的每个studends-因此,如果您需要原始结构,则必须转换结果
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']
]
--- 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]}
编辑:我发布了可以将其转换为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)
结果
[
['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']
]
--- 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]}
最大的问题是您的数据结构-您将值保存在单独的列表中,但是关于单个学生的所有信息都应该保存在单个字典或列表中,这样做会更容易
大概是这样的:
studends = [
{'Name': 'Colin', 'FirstName': 'Jonas', 'TP01': '7', 'TP02': '12', 'TP03': '11', 'EXAMEN_INTRA': '22', 'EXAMEN_FINAL': '28'},
{'Name': 'Doyon', 'FirstName': 'Elisabeth', ....},
...
]
此代码使用sum>30获取所有studends,但它会返回单独列表中的每个studends-因此,如果您需要原始结构,则必须转换结果
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']
]
--- 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]}
编辑:我发布了可以将其转换为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)
结果
[
['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']
]
--- 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]}
您现在知道如何使用“if”
如果sum(…)>30:…
很抱歉您今天过得不好,如果您想了解学生的信息,您必须zip()
其他信息zip(dict_-etudiants['Name'],dict_-etudiants['TP01'],…)
我知道这一点。我尝试过许多解决方案,而这恰好是最后一个。我必须提供一些代码,所以很明显我没有提供接近工作的东西。对我来说,最糟糕的事情是你的数据结构-你保留在单独的列表名称、名字等中。你应该在sinlge字典或列表中保留关于单个学生的信息。你现在知道如何使用“if”
如果sum(…)>30:…
很抱歉您今天过得不好,如果您想了解学生的信息,您必须zip()
其他信息zip(dict_-etudiants['Name'],dict_-etudiants['TP01'],…)
我知道这一点。我尝试过许多解决方案,而这恰好是最后一个。我必须提供一些代码,所以很明显我没有提供接近工作的东西。对我来说,最糟糕的事情是你的数据结构-你保留在单独的列表名、名等中。你应该在sinlge字典或列表中保留关于单个学生的信息。你完全正确。字典格式是个问题。Python不适合处理这样的结构。我发布了一个版本,你可以将它转换成pandas.DataFrame
,然后就很容易了。请参阅答案中的新代码。您完全正确。字典格式是个问题。Python不适合处理这样的结构。我发布了一个版本,你可以将它转换成pandas.DataFrame
,然后就很容易了。请参阅答案中的新代码。