Python列表与元组核心应用:从NOJ作业看数据处理能力进阶

1. 项目概述:从NOJ作业看Python核心能力进阶

最近在辅导一些同学学习Python,发现很多人卡在了从基础语法到解决实际问题的过渡阶段。他们能写 print(“Hello World”) ,能理解 if-else ,但一遇到稍微综合一点的题目,比如处理一组数据、分析文本或者模拟一个简单流程,就不知道如何下手了。这让我想起了很多高校使用的在线判题系统(Online Judge),比如西北工业大学的NOJ。它的Python程序设计作业,尤其是61-70题这个区间,是一个非常典型的“能力分水岭”。这个阶段的题目,往往不再考察孤立的语法点,而是开始聚焦于 列表与元组 的深度应用,要求学习者能够灵活运用这些数据结构去建模和解决实际问题。

如果你正在学习Python,并且感觉基础语法已经看过一遍,但做题还是吃力,那么集中攻克NOJ 61-70这类题目会是一个极好的选择。它们像是一组精心设计的“关卡”,逼迫你去理解如何用列表存储数据、用循环遍历元素、用条件判断处理边界,以及如何组合这些基本操作来完成一个具体任务。通过这组练习,你不仅能巩固 列表推导式 切片操作 元组打包解包 这些核心语法,更能建立起“将问题转化为代码步骤”的思维模式。接下来,我将结合常见的题目类型和核心考点,拆解其中的思路与技巧,并提供可直接参考的解题框架和避坑指南。

2. 核心考点与解题思路全解析

NOJ 61-70题的题目设置,通常围绕着几个核心的数据处理场景展开。理解这些场景背后的通用思路,比死记硬背某一道题的答案要有用得多。

2.1 列表的遍历与条件筛选

这是最基本也是最频繁的操作。题目可能要求你从一个成绩列表中找出高于平均分的人,或者从一串数字中筛选出所有偶数并构成新列表。

核心思路

  1. 数据准备 :首先,题目通常会以某种形式给你输入数据,可能是空格分隔的一行数字,也可能是多行字符串。你需要用 input().split() 读取并转换为数值列表(如 list(map(int, input().split())) )。
  2. 遍历与判断 :使用 for 循环遍历列表中的每一个元素。
  3. 结果收集 :在循环内部,使用 if 语句判断元素是否满足条件。如果满足,则将其添加到一个新的结果列表中(使用 append() 方法)。

代码框架示例

# 示例:筛选列表中的正数
data = list(map(int, input().split()))  # 假设输入如:1 -2 3 -4 5
result = []
for num in data:
    if num > 0:          # 筛选条件
        result.append(num)
print(result)  # 输出:[1, 3, 5]

进阶技巧——列表推导式 : 上述循环判断的流程,可以用一行列表推导式优雅地完成,这是Pythonic写法,执行效率也更高。

result = [num for num in data if num > 0]

对于初学者,我建议先用标准的 for-if-append 把逻辑写清楚,确保正确无误后,再尝试改写成列表推导式,这是一个很好的思维训练。

2.2 列表的统计与聚合计算

这类题目要求你对列表元素进行求和、求平均值、找最大值最小值、计数等。例如,计算班级成绩的平均分、最高分、最低分,或者统计一段文本中某个字母出现的次数。

核心思路

  1. 初始化变量 :在循环开始前,准备好存放结果的变量。例如,求和需要 total = 0 ,找最大值需要 max_value = float(‘-inf’) 或直接用列表第一个元素 data[0] (需确保列表非空)。
  2. 遍历与更新 :在遍历列表的循环中,不断更新这些变量。
  3. 处理边界 :特别注意空列表的情况。例如,对空列表求平均值会导致除零错误。

代码框架示例(求最大值、最小值、平均值)

scores = [85, 92, 78, 90, 88]
if not scores:  # 重要:先判断列表是否为空
    print("列表为空")
else:
    max_score = scores[0]
    min_score = scores[0]
    total = 0

    for score in scores:
        if score > max_score:
            max_score = score
        if score < min_score:
            min_score = score
        total += score

    average = total / len(scores)
    print(f"最高分:{max_score}, 最低分:{min_score}, 平均分:{average:.2f}")

内置函数是利器 : Python提供了强大的内置函数来简化这些操作:

  • sum(list) :直接求和。
  • max(list) , min(list) :直接找最大最小值。
  • len(list) :获取长度。 在NOJ作业中,通常允许使用这些函数,这能极大简化代码。但理解其背后的遍历逻辑至关重要。

2.3 列表的排序与去重

排序和去重是数据处理中的经典操作。题目可能要求你将成绩从高到低排序,或者从一个包含重复元素的列表中提取出唯一元素。

核心思路

  1. 排序 :使用列表的 sort() 方法(原地修改)或 sorted() 函数(返回新列表)。关键在于 reverse 参数控制升序降序,以及 key 参数实现自定义排序规则(例如按字符串长度、按元组第二个元素排序)。
  2. 去重
    • 简单方法(不保序) :利用集合( set )元素唯一的特性, list(set(original_list)) ,但会丢失原有顺序。
    • 保序方法 :遍历原列表,将首次出现的元素加入新列表。
    • 直接方法 :使用 dict.fromkeys() (Python 3.7+字典保序)。

代码示例与对比

# 原始列表
nums = [3, 1, 2, 2, 3, 1, 4]

# 1. 排序(升序)
nums.sort()  # 原地排序,nums变为 [1, 1, 2, 2, 3, 3, 4]
sorted_nums = sorted(nums, reverse=True)  # 降序排序,返回新列表 [4, 3, 3, 2, 2, 1, 1]

# 2. 去重
# 方法A:使用集合(不保序)
unique_set = list(set(nums))  # 结果可能是 [1, 2, 3, 4] 或其它顺序

# 方法B:遍历保序
unique_ordered = []
for num in nums:
    if num not in unique_ordered:
        unique_ordered.append(num)
# unique_ordered 结果为 [3, 1, 2, 4]

# 方法C:使用dict.fromkeys (Python 3.7+ 保序)
unique_dict = list(dict.fromkeys(nums))  # 结果同方法B

注意 :在NOJ题目中,如果题目要求“按输入顺序输出唯一元素”,则必须使用保序的去重方法。仔细审题是关键。

2.4 元组的特性与应用场景

元组( tuple )在61-70题中出现的频率可能低于列表,但其“不可变”的特性决定了其独特的应用场景。

核心思路

  1. 作为不可变记录 :当你需要存储一组相关的、在逻辑上不应被修改的数据时,使用元组。例如,一个点的坐标 (x, y) ,一个人的基本信息 (name, age, id) 。在函数需要返回多个值时,也通常返回一个元组。
  2. 字典的键 :因为字典的键必须是不可变的,所以元组(当其元素均为不可变类型时)可以作为字典的键,而列表不行。例如,可以用 (row, col) 元组作为键来表示棋盘上的一个位置。
  3. 打包与解包 :这是元组操作的精髓。 a, b = b, a 这句经典的交换语句,背后就是元组的打包和解包。

典型题目模式 : 题目可能要求你处理一系列坐标点,计算点之间的距离,或者按照多个标准(如先按成绩降序,成绩相同按学号升序)对学生记录进行排序。这时,将每个学生表示为 (score, id, name) 这样的元组,将多个学生放在一个列表中,再利用 sorted(students, key=lambda x: (-x[0], x[1])) 进行多级排序,会非常方便。

示例:多级排序

students = [
    (85, 1002, '张三'),
    (92, 1001, '李四'),
    (85, 1003, '王五')
]
# 按成绩降序,成绩相同时按学号升序
sorted_students = sorted(students, key=lambda x: (-x[0], x[1]))
print(sorted_students)
# 输出:[(92, 1001, '李四'), (85, 1002, '张三'), (85, 1003, '王五')]

这里 lambda x: (-x[0], x[1]) 创建了一个匿名函数,它返回一个元组 (-成绩, 学号) 。排序时,Python会先比较元组的第一个元素(负的成绩,因此越大成绩反而负值越小,排前面),如果相同再比较第二个元素(学号)。

3. 典型题目实战拆解与代码实现

让我们模拟两道NOJ这个难度区间的典型题目,并给出从理解到实现的完整过程。

3.1 实战案例一:成绩分析报告

题目描述 :输入一行整数,表示某班级所有学生的成绩。编写程序,输出:1) 最高分和最低分;2) 平均分(保留两位小数);3) 高于平均分的学生成绩列表(按输入顺序)。

思路拆解

  1. 输入处理 :使用 input().split() 读取字符串并分割,再用 map(int, ...) 转换为整数,最后用 list() 转为列表。这是处理单行数字输入的标准操作。
  2. 计算极值与总和 :遍历列表,同时更新最大值、最小值和总和。也可以直接使用 max() , min() , sum() 函数,但为了演示遍历思想,我们先用基础方法。
  3. 计算平均值 :总和除以学生人数(列表长度)。 务必处理除零错误 (即空输入)。
  4. 筛选高于平均分的成绩 :再次遍历成绩列表,将大于平均分的成绩加入新列表。
  5. 格式化输出 :按要求格式打印结果,平均分使用 f”{avg:.2f}” 格式化。

完整代码实现

# 读取输入并转换为成绩列表
scores_input = input()
if not scores_input.strip():  # 处理空输入或纯空格输入
    print("无成绩输入")
else:
    scores = list(map(int, scores_input.split()))

    # 初始化统计变量
    total = 0
    max_score = scores[0]  # 假设列表非空(因为上面已判断输入非空)
    min_score = scores[0]

    # 第一次遍历:计算总和、最大值、最小值
    for s in scores:
        total += s
        if s > max_score:
            max_score = s
        if s < min_score:
            min_score = s

    # 计算平均分
    average = total / len(scores)

    # 第二次遍历:筛选高于平均分的成绩
    above_avg = []
    for s in scores:
        if s > average:
            above_avg.append(s)

    # 输出结果
    print(f"最高分:{max_score} 最低分:{min_score}")
    print(f"平均分:{average:.2f}")
    print("高于平均分的成绩:", end="")
    # 打印列表时去掉方括号,用空格分隔
    print(' '.join(map(str, above_avg)))

优化与讨论

  • 上述代码为了逻辑清晰,遍历了两次列表。实际上,筛选操作可以在第一次遍历中同步完成,但需要先计算平均值,这又要求必须先遍历一次得到总和。这是一个“先有鸡还是先有蛋”的问题。除非我们愿意存储所有成绩后再做筛选,否则两次遍历是合理的。在数据量不大时,完全可接受。
  • 更Pythonic的写法可以大量使用内置函数和列表推导式,使代码更简洁:
if scores:
    max_score = max(scores)
    min_score = min(scores)
    average = sum(scores) / len(scores)
    above_avg = [s for s in scores if s > average]
    # ... 输出部分相同

在NOJ中,只要题目不明确禁止,应优先使用这种简洁高效的写法。

3.2 实战案例二:单词频率统计(简易版)

题目描述 :输入一行英文句子,单词之间以空格分隔。统计每个单词出现的次数,并按照单词出现次数从高到低排序,如果次数相同,则按照单词的字典序升序排列。输出排序后的单词及其次数。

思路拆解

  1. 输入与清洗 :使用 input().split() 直接获取单词列表。注意,题目假设了标准空格分隔,如果考虑标点,可能需要更复杂的清洗(如用 strip(‘.,!?’) ),但本题简化处理。
  2. 构建频率字典 :创建一个空字典 word_count = {} 。遍历单词列表,对于每个单词,如果它不在字典中,则将其作为键加入,值设为1;如果已在字典中,则将其值加1。这是经典的“词频统计”模式。
  3. 排序准备 :字典的项( items() )是 (单词, 次数) 的元组列表。我们需要对这个列表进行排序。
  4. 复杂排序规则实现 :排序规则是“次数降序,次数相同时单词升序”。这需要自定义排序的 key 函数。我们可以让 key 函数返回一个元组 (-次数, 单词) -次数 实现了降序, 单词 实现了升序。
  5. 输出 :遍历排序后的列表,按格式输出。

完整代码实现

# 读取输入
sentence = input()
words = sentence.split()  # 获取单词列表

# 统计词频
word_count = {}
for word in words:
    # get方法:如果word在字典中,返回其值;否则返回默认值0,然后加1
    word_count[word] = word_count.get(word, 0) + 1

# 将字典项转换为列表进行排序
# items()返回形如 [('hello', 2), ('world', 1)] 的列表
items_list = list(word_count.items())

# 自定义排序:先按次数降序,再按单词升序
# key=lambda x: (-x[1], x[0])
# x是每个元组,x[1]是次数,取负号实现降序;x[0]是单词,默认升序
sorted_items = sorted(items_list, key=lambda x: (-x[1], x[0]))

# 输出结果
for word, count in sorted_items:
    print(f"{word}: {count}")

深入思考

  • 字典的 get 方法 word_count.get(word, 0) 是处理这类“如果不存在则初始化,存在则累加”场景的优雅写法,避免了冗长的 if word in word_count: 判断。
  • 排序的 key 函数 :理解 lambda x: (-x[1], x[0]) 是本题的核心。它创建了一个临时元组作为排序依据。Python比较两个元组时,会依次比较每个位置上的元素。因此, (-5, ‘apple’) 会排在 (-3, ‘banana’) 前面(因为-5 < -3?不对,是-5更小,但我们要的是降序,所以实际上 -次数 使得次数大的其负值更小,排在前面)。如果 -次数 相同,则比较 单词 ,按字母序升序排列。
  • 边界情况 :如果输入是空字符串, words 会是一个空列表,循环不会执行, word_count 为空字典,排序和输出也不会进行,程序正常结束。这通常是可接受的行为。

4. 高频错误与调试技巧实录

在完成这类作业的过程中,几乎所有人都会踩一些相似的“坑”。下面我总结几个最常见的错误及其解决方法。

4.1 输入处理导致的类型错误

错误现象 ValueError: invalid literal for int() with base 10: ‘’ 或类似的类型转换错误。

原因分析

  1. 输入字符串中包含非数字字符(如字母、多余的空格、换行符)。
  2. 使用 split() 分割后,可能产生了空字符串 ‘’ (当输入开头、结尾有空格,或连续多个空格时)。
  3. 直接对这样的空字符串调用 int(‘’) ,必然报错。

解决方案

  • 防御性编程 :在转换前进行清洗或检查。
    # 方法1:使用列表推导式过滤空字符串
    str_list = input().split()
    num_list = [int(x) for x in str_list if x.strip()]  # 过滤掉空或纯空格的项
    
    # 方法2:使用filter函数
    str_list = input().split()
    num_list = list(map(int, filter(None, str_list)))  # filter(None, ...) 过滤掉假值(空字符串)
    
    # 方法3:确保输入格式(在已知题目格式规范时可用)
    # 直接使用 map(int, input().split()),但前提是你确信输入是干净的。
    
  • 使用try-except :在不确定输入是否完全规范时,可以捕获异常。
    num_list = []
    for s in input().split():
        try:
            num_list.append(int(s))
        except ValueError:
            pass  # 忽略非数字输入,或者打印警告
    

4.2 列表索引越界

错误现象 IndexError: list index out of range

原因分析

  1. 在循环中使用了固定的索引范围(如 for i in range(len(list)): ),但在循环体内可能修改了列表(如删除了元素),导致索引超出修改后列表的长度。
  2. 直接访问 list[-1] list[len(list)] 。记住,有效索引范围是 0 len(list)-1 list[-1] 是访问最后一个元素,是合法的,但 list[len(list)] 一定越界。

解决方案

  • 遍历元素而非索引 :如果不需要索引,直接使用 for item in my_list:
  • 需要索引时,遍历索引副本 :如果需要在遍历时修改原列表(如删除元素),一个安全的方法是遍历其索引的副本或反向遍历。
    # 错误示例:遍历时删除
    my_list = [1, 2, 3, 2, 4]
    for i in range(len(my_list)):
        if my_list[i] == 2:
            del my_list[i]  # 删除后列表变短,后续索引i可能越界
    
    # 正确方法1:使用列表推导式创建新列表(推荐)
    my_list = [x for x in my_list if x != 2]
    
    # 正确方法2:如果需要原地修改,可以反向遍历
    for i in range(len(my_list)-1, -1, -1):  # 从后往前
        if my_list[i] == 2:
            del my_list[i]
    
    # 正确方法3:遍历副本,操作原列表
    for item in my_list[:]:  # my_list[:]是原列表的浅拷贝
        if item == 2:
            my_list.remove(item)  # 注意:remove会删除第一个匹配项,可能不是预期行为
    
  • 访问前检查长度 :在访问 list[i] 前,确保 0 <= i < len(list)

4.3 可变与不可变对象的误用

错误现象 :对元组进行修改操作,导致 TypeError: ‘tuple’ object does not support item assignment 。或者在函数中试图修改传入的整数、字符串参数,发现外部变量没变。

原因分析 :混淆了可变对象(如列表、字典、集合)和不可变对象(如整数、浮点数、字符串、元组)。对于不可变对象,任何“修改”操作(如赋值、 += )实际上都是创建了一个新的对象。

解决方案

  • 牢记类型特性
    • 列表 :可增删改。 append() , extend() , insert() , remove() , pop() , sort() (原地), list[i] = new_value
    • 元组 :不可增删改。只能通过索引访问,不能赋值。但若元组内包含可变对象(如列表),该列表本身是可以修改的。
  • 函数参数传递 :如果需要在函数内部修改外部的一个列表,可以直接修改(因为列表是可变对象)。但如果“参数”是一个整数或元组,想修改外部变量的值,则需要通过返回值来传递。
    def modify_list(lst):
        lst.append(100)  # 会修改外部传入的列表
    
    def modify_number(num):
        num += 100  # 不会修改外部变量,只是创建了局部变量
        return num  # 必须返回
    
    my_list = [1, 2]
    modify_list(my_list)
    print(my_list)  # 输出:[1, 2, 100]
    
    my_num = 10
    my_num = modify_number(my_num)  # 需要重新赋值
    print(my_num)  # 输出:110
    

4.4 逻辑错误:循环与条件判断

错误现象 :程序能运行,但结果不对。比如该筛选的没筛选出来,求和结果偏大或偏小。

原因分析

  1. 缩进错误 :Python用缩进定义代码块。 if for while 下面的语句如果缩进不对,逻辑就全乱了。这是新手最容易犯的错误之一。
  2. 条件表达式错误 :使用了错误的比较运算符(如 = 赋值与 == 比较混淆),或者逻辑组合( and / or )优先级理解有误。
  3. 循环变量覆盖 :在嵌套循环或复杂逻辑中,不小心重用或修改了循环变量。
  4. 边界条件处理不当 :例如,在遍历寻找最大值时,将初始值设为0,但列表中可能全是负数,导致结果错误。

调试技巧

  • 打印中间变量 :在关键步骤后(如循环开始、结束,条件判断分支),使用 print() 输出相关变量的值。这是最直接有效的调试方法。
    total = 0
    for i, num in enumerate(data):  # enumerate可以同时获得索引和值
        total += num
        print(f”循环第{i}次,当前num={num}, total={total}”)  # 观察累加过程
    
  • 使用调试器 :如果使用PyCharm、VSCode等IDE,学会使用其内置调试器设置断点、单步执行、查看变量值。
  • 代码复审 :写完代码后,从头到尾在心里“执行”一遍,特别是关注循环的第一次和最后一次迭代,以及条件判断的边界情况(等于、大于、小于)。
  • 编写测试用例 :用几组简单的、边界的数据测试你的程序。例如:空列表、只有一个元素的列表、全正数、全负数、有重复值等。

5. 效率优化与Pythonic编程习惯

当题目数据量增大,或者对程序运行时间有要求时,代码的效率就变得重要了。同时,写出更“Pythonic”(符合Python风格的)代码,能让程序更简洁、可读性更强。

5.1 选择合适的数据结构与算法

  • 成员判断用集合 :如果你需要频繁判断一个元素是否存在于一个集合中(例如去重时的 if num not in seen: ),使用列表的 in 操作时间复杂度是O(n),而使用集合( set )的 in 操作平均是O(1)。当数据量大时,性能差异巨大。
    # 低效(列表)
    seen_list = []
    for item in large_data:
        if item not in seen_list:  # 每次都要遍历整个seen_list
            seen_list.append(item)
    
    # 高效(集合)
    seen_set = set()
    for item in large_data:
        if item not in seen_set:  # 平均O(1)的查找
            seen_set.add(item)
    unique_list = list(seen_set)  # 最后如果需要列表再转换
    
  • 避免在循环内进行重复计算 :将循环内不变的计算提到循环外。
    # 低效
    for i in range(len(data)):
        result.append(data[i] * len(data))  # 每次循环都计算len(data)
    
    # 高效
    n = len(data)
    for i in range(n):
        result.append(data[i] * n)
    

5.2 善用内置函数与标准库

Python拥有“内置电池”哲学,很多常见操作都有现成的高效实现。

  • 求和、最大/最小值 :直接用 sum() , max() , min() ,它们是用C实现的,比手写Python循环快得多。
  • 排序 sorted() 函数和 list.sort() 方法使用的是高效的Timsort算法。
  • 计数 collections 模块中的 Counter 类是词频统计的神器。
    from collections import Counter
    words = [“apple”, “banana”, “apple”, “orange”, “banana”, “apple”]
    word_counts = Counter(words)
    print(word_counts)  # 输出:Counter({‘apple’: 3, ‘banana’: 2, ‘orange’: 1})
    print(word_counts.most_common(2))  # 输出出现次数最多的前2项: [(‘apple’, 3), (‘banana’, 2)]
    
    Counter 重写之前的词频统计题,代码会异常简洁:
    from collections import Counter
    words = input().split()
    word_counts = Counter(words)
    # 排序:most_common()返回的就是(单词,次数)的列表,且已按次数降序
    # 但次数相同未按单词排序,所以我们仍需自定义排序
    sorted_items = sorted(word_counts.items(), key=lambda x: (-x[1], x[0]))
    for word, count in sorted_items:
        print(f”{word}: {count}”)
    

5.3 编写清晰可读的代码

“程序是写给人看的,顺便给机器执行。”良好的代码风格至关重要。

  • 使用有意义的变量名 :避免使用 a , b , x , y 等单字母变量(除非在非常短的循环内)。使用 student_scores , total_count , average_height 这样的名字。
  • 添加必要的注释 :在复杂的逻辑块、算法步骤前,用注释说明意图。但避免对显而易见的代码进行注释(如 i += 1 # i增加1 )。
  • 保持函数短小单一 :如果一个函数做了太多事情,考虑将其拆分成几个更小的函数。每个函数只做好一件事。
  • 遵循PEP 8风格指南 :使用4个空格缩进,运算符两边加空格,在逗号后加空格等。大多数IDE都可以自动格式化代码。

攻克NOJ 61-70这类题目,真正的价值不在于“做完”,而在于通过这十道题,你是否真正掌握了用列表和元组去思考问题、分解问题、并用代码组合解决的能力。我个人的体会是,遇到卡壳的题目时,不要急着搜答案,先用纸笔把输入、输出、中间步骤画出来,把抽象的逻辑具象化,往往思路就清晰了。另外,多看看别人优秀的解法,特别是那些简洁、高效的Pythonic写法,对比自己的代码,思考差距在哪里,这是提升编程品味和能力的快车道。最后,编程是门实践手艺,多写、多调、多总结,手感自然就来了。

内容概要:本文研究了在通信资源受限恶意攻击干扰下的孤岛微电网分布式二次控制策略,提出了一种兼具通信效率攻击弹性的动态事件触发控制方案,旨在实现电压频率的精确恢复有功无功功率的均衡共享。通过Simulink仿真Matlab代码实现,系统验证了该策略在显著降低通信频次的同时,能够有效抵御拒绝服务(DoS)等网络攻击,保障微电网在复杂环境下的稳定运行。研究深入探讨了动态事件触发机制的设计、分布式控制算法的弹性优化,并确保系统具备排除芝诺行为的能力,从而全面提升微电网在极端条件下的鲁棒性、可靠性运行效率。; 适合人群:具备电力系统、自动化或相关领域基础知识,从事微电网、分布式控制、能源系统安全方向研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于孤岛微电网在遭受通信限制和网络攻击时的二次电压频率调节;②为高比例新能源接入场景下的微电网提供具备攻击容忍能力的弹性控制解决方案;③支持科研仿真验证教学演示,推动分布式能源系统安全控制技术的发展。; 阅读建议:建议结合提供的Simulink模型Matlab代码进行仿真实践,深入理解控制策略的实现细节,并可通过修改攻击模型、通信参数或网络拓扑进行拓展性研究,以全面掌握其弹性机制优化潜力。
上市公司绿色全要素生产率(Green Total Factor Productivity,简称GTFP)是衡量企业绿色发展和资源配置效率的重要指标,其仅关注经济效益,还强调环境效益,体现了绿色发展理念。 一、上市公司绿色全要素生产率的介绍 上市公司绿色全要素生产率是衡量企业在实现绿色发展的过程中,如何有效地利用劳动、资本、能源等资源进行生产的综合效率。本分享数据涵盖2500+家上市公司,数据年份为2007-2022年,共46424条样本,含证券代码、年份、绿色全要素生产率、绿色技术效率变化指数、绿色技术进步变化指数。 二、数据指标 绿色全要素生产率 绿色技术效率变化指数 绿色技术进步变化指数 用于衡量企业绿色发展效率的综合指标 反映绿色技术使用效率的变化 衡量绿色技术进步的效果 三、测算方式 企业绿色全要素生产率的测算采用了非径向SBM-ML指数(简称“ML指数”)模型。该模型通过将企业的环境污染、绿色技术进步等因素纳入生产效率评价体系,全面反映了企业在绿色发展方面的整体表现。 具体的测算方式如下: (1)要素投入:以企业员工数作为劳动投入的代理变量,企业固定资产净额作为资本投入的代理变量,企业所在城市的工业用电量根据企业从业人员占城市城镇人员就业比重进行换算作为能源投入的代理变量。 (2)期望产出:以企业的营业收入作为期望产出的代理变量。 (3)非期望产出:将企业从业人员占所在城市城镇人员就业比重“工业三废”(即工业二氧化硫、工业废水、工业烟粉尘排放量)结合,进行换算,作为非期望产出的代理变量。 四、参考文献 崔立志,孙旺,黄敏敏.新能源示范城市建设对企业绿色全要素生产率的影响研究——基于A股上市公司的实证分析[J].广西财经学院学报,2023,36(01):92-104. 五、数据来源 数据来源于《中国城市统计年鉴》、《中国环境统计年鉴》、
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值