Python中如何对列表的列表使用map函数?CSV学生成绩筛选问题求助
问题分析与解决方案
看起来你在使用map处理CSV转换后的列表时遇到了两个核心问题:函数逻辑不符合预期和**map的用法错误**,这才导致list2全是None。我们一步步拆解问题,再给出修正方案。
为什么会输出全None?
你的代码里有两个关键错误:
selection函数的逻辑错误
你写的selection函数接收的是单个元素(比如'Alfalfa'、'49'这类字符串),而不是整个学生行。当map(selection, i)执行时,它会把每个学生行i里的每个子元素单独传给selection。
同时,selection函数只有在遍历到某个字符是数字且转成整数大于50时,才会返回传入的lis(也就是那个单个元素);其他情况都没有显式return,Python函数默认会返回None。而你的CSV里最高分数是49,根本不满足>50的条件,所以所有调用都返回None。map的用法不符合你的需求
你想要的是判断每个学生是否符合分数条件,所以应该把selection作用在整个学生行上(也就是list1的每个元素),而不是把每个学生行拆成单个元素去处理。
修正后的代码
我们重新调整selection函数的逻辑,让它接收整个学生行,提取分数并判断,然后返回你需要的结果(比如返回符合条件的学生行,或者返回是否入选的标记)。这里提供两种常见需求的实现:
需求1:筛选出分数>50的学生行
import csv # 接收单个学生行,判断分数是否大于50,符合条件则返回该行,否则返回None def selection(student_row): # 提取Final分数(注意索引是2,因为列表从0开始:Last name(0), First name(1), Final(2), Grade(3)) score_str = student_row[2].strip() # 处理可能的空格 if score_str.isdigit() and int(score_str) > 50: return student_row # 不符合条件时不返回,默认返回None list1 = [] with open('D:\C++\Programs\Advanced Programming\grades.csv', 'r') as csv_file: csv_reader = csv.reader(csv_file) next(csv_reader) # 跳过表头 list1 = list(csv_reader) # 直接转成列表,不用循环append # 用map处理整个list1的每个学生行,然后过滤掉None值 list2 = list(filter(None, map(selection, list1))) print("原始学生列表:") print(list1) print("\n分数大于50的学生列表:") print(list2)
需求2:为每个学生标记是否入选(返回布尔值或自定义标记)
如果你想保留所有学生,同时标记是否符合条件,可以修改selection返回标记:
import csv def selection(student_row): score_str = student_row[2].strip() if score_str.isdigit() and int(score_str) > 50: return student_row + ["入选"] else: return student_row + ["未入选"] list1 = [] with open('D:\C++\Programs\Advanced Programming\grades.csv', 'r') as csv_file: csv_reader = csv.reader(csv_file) next(csv_reader) list1 = list(csv_reader) list2 = list(map(selection, list1)) print("原始学生列表:") print(list1) print("\n标记后的学生列表:") print(list2)
额外优化点
- 读取CSV时可以直接用
list(csv_reader)把所有行转成列表,不用手动循环append,更简洁。 - 处理分数时加上
strip(),避免CSV里的分数前后有空格导致isdigit()判断失败。 - 如果需要更灵活的筛选,也可以用列表推导式替代
map+filter,比如:
这种写法可读性可能更高,适合简单的筛选场景。list2 = [row for row in list1 if row[2].strip().isdigit() and int(row[2].strip()) > 50]
内容的提问来源于stack exchange,提问作者Satyabrata Kar
相关产品推荐
相关产品推荐

