请教两段Python代码的差异:执行结果不同但逻辑看似一致
两段Python代码的差异分析
基础代码
import pandas as pd df = pd.DataFrame({"A":[1, 2, 3, 4, 5],"B":[10, 20, 30, 40, 50],"C":[11, 22, 33, 44, 55],"D":[12, 24, 51, 36, 2]}) num_pairs = [(1,5),(2,10),(3,15),(4,20),(5,25)] num_range = list(range(8,16))
代码1:列表推导式赋值
df['E'] = [num_pair[0] if num_pair[1] in num_range else 0 for num_pair in num_pairs]
这段代码通过列表推导式生成一个长度为5的列表,每个元素对应num_pairs中单个元组的判断结果:
- 遍历
num_pairs里的每个元组,检查元组第二个元素是否在num_range(8-15区间)内 - 符合条件就取元组第一个元素,否则取0
- 最终生成列表
[0, 2, 3, 0, 0],直接赋值给df['E'],让列中每行对应列表里的一个值。
代码2:循环覆盖赋值
for num_pair in num_pairs: if num_pair[1] in num_range: df['E']= num_pair[0] else: df['E'] = 0
这段代码是循环整列覆盖赋值:
- 每次循环都会把
df['E']整列设置为同一个值:- 第一次循环:元组(1,5),5不在8-15区间,整列设为0
- 第二次循环:元组(2,10),10在区间内,整列设为2
- 第三次循环:元组(3,15),15在区间内,整列设为3
- 第四次循环:元组(4,20),20不在区间,整列设为0
- 第五次循环:元组(5,25),25不在区间,整列设为0
- 最终
df['E']整列都是0,因为最后一次循环的赋值完全覆盖了之前的结果。
核心差异
- 代码1是一次性生成对应每行的多值列表,给
df['E']的每行分配不同的值 - 代码2是每次循环都给整列赋单一值,后续循环的赋值会完全覆盖之前的结果,最终只保留最后一次循环的赋值
内容的提问来源于stack exchange,提问作者MarvinLok
相关产品推荐
相关产品推荐

