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

列表推导式及DataFrame构建中双重for循环的工作原理解析

拆解Pandas DataFrame创建中的双重循环生成器

嘿,这个问题问得好!作为Pandas新手,这种嵌套的生成器表达式确实容易让人懵,我来一步步给你拆解开讲清楚~

首先,我们先拿一个具体的字典例子来辅助理解,假设你的dic是这样的:

dic = {
    "California": ["Los Angeles", "San Francisco", "San Diego"],
    "Texas": ["Austin", "Dallas", "Houston"],
    "New York": ["New York City", "Buffalo"]
}

你的原代码是:

df = pd.DataFrame(([st, cty] for st, cty in dic.items() for cty in dic[st]), columns=["State", "City"])

这里先提个小细节:外层循环里的cty变量名其实有点误导——它对应的是字典里的城市列表,而不是单个城市。我们把变量名改成更清晰的版本,逻辑完全一致:

df = pd.DataFrame(([st, city] for st, cities in dic.items() for city in cities), columns=["State", "City"])

接下来我们拆解这个双重循环的工作机制:

1. 外层循环:遍历字典的州与城市列表

for st, cities in dic.items() 会逐个取出字典里的键值对:

  • st 是州的名称(字典的键),比如第一次循环st = "California"
  • cities 是该州对应的城市列表(字典的值),比如第一次循环cities = ["Los Angeles", "San Francisco", "San Diego"]

2. 内层循环:遍历单个州的所有城市

for city in cities 会对当前州的城市列表进行逐个遍历:

  • 当st是"California"时,内层循环会依次取出"Los Angeles"、"San Francisco"、"San Diego"
  • 每取出一个城市,就会生成一个[st, city]的列表,比如["California", "Los Angeles"]

3. 生成器的作用:按需产出行数据

整个表达式([st, city] for st, cities in dic.items() for city in cities)是一个生成器,它不会一次性把所有行数据都加载到内存里,而是按需生成每一行的[州, 城市]列表。

Pandas的DataFrame构造函数会接收这些生成的列表,把每个列表当成一行数据,再用columns=["State", "City"]指定每一列的名称,最终就得到了你想要的扁平表格。

等价的直观写法(新手友好)

如果你觉得生成器太抽象,可以用普通的for循环模拟这个过程,效果完全一样:

# 先手动生成所有行数据的列表
rows = []
for st, cities in dic.items():
    for city in cities:
        rows.append([st, city])

# 再创建DataFrame
df = pd.DataFrame(rows, columns=["State", "City"])

为什么用生成器而不是列表?

生成器是惰性求值的,只有当Pandas需要读取下一行数据时,它才会生成对应的列表。如果你的字典里有大量的州和城市,生成器会比先创建完整列表更节省内存,这是它的优势。

总结一下:这个双重循环的核心就是把嵌套的「州→城市列表」结构,展开成扁平的「州-城市」配对行,刚好符合DataFrame需要的二维表格格式~

内容的提问来源于stack exchange,提问作者CuriousLearner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:11:46