Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果3个字段的总和为某个数字,则返回字典项_Python_Dictionary - Fatal编程技术网

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
    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

最大的问题是您的数据结构-您将值保存在单独的列表中,但是关于单个学生的所有信息都应该保存在单个字典或列表中,这样做会更容易

大概是这样的:

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
,然后就很容易了。请参阅答案中的新代码。