You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何对列表的列表使用map函数?CSV学生成绩筛选问题求助

问题分析与解决方案

看起来你在使用map处理CSV转换后的列表时遇到了两个核心问题:函数逻辑不符合预期和**map的用法错误**,这才导致list2全是None。我们一步步拆解问题,再给出修正方案。

为什么会输出全None?

你的代码里有两个关键错误:

  1. selection函数的逻辑错误
    你写的selection函数接收的是单个元素(比如'Alfalfa'、'49'这类字符串),而不是整个学生行。当map(selection, i)执行时,它会把每个学生行i里的每个子元素单独传给selection。
    同时,selection函数只有在遍历到某个字符是数字且转成整数大于50时,才会返回传入的lis(也就是那个单个元素);其他情况都没有显式return,Python函数默认会返回None。而你的CSV里最高分数是49,根本不满足>50的条件,所以所有调用都返回None。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 16:12:40