Ngu*_*Tan 5 python nested-loops
我是 python 编程的新手。我已经尝试了很多来避免这些嵌套的 for 循环,但没有成功。
我的数据输入如下:
[
{
"province_id": "1",
"name": "HCM",
"districts": [
{
"district_id": "1",
"name": "Thu Duc",
"wards": [
{
"ward_id": "1",
"name": "Linh Trung"
},
{
"ward_id": "2",
"name": "Linh Chieu"
}
]
},
{
"district_id": "2",
"name": "Quan 9",
"wards": [
{
"ward_id": "3",
"name": "Hiep Phu"
},
{
"ward_id": "4",
"name": "Long Binh"
}
]
}
]
},
{
"province_id": "2",
"name": "Binh Duong",
"districts": [
{
"district_id": "3",
"name": "Di An",
"wards": [
{
"ward_id": "5",
"name": "Dong Hoa"
},
{
"ward_id": "6",
"name": "Di An"
}
]
},
{
"district_id": "4",
"name": "Thu Dau Mot",
"wards": [
{
"ward_id": "7",
"name": "Hiep Thanh"
},
{
"ward_id": "8",
"name": "Hiep An"
}
]
}
]
}
]
Run Code Online (Sandbox Code Playgroud)
我的代码是:
for province in data:
for district in province['districts']:
for ward in district['wards']:
# Excute my function
print('{}, {}, {}'.format(ward['name'], district['name'], province['name']))
Run Code Online (Sandbox Code Playgroud)
输出
Linh Trung, Thu Duc, HCM
Linh Chieu, Thu Duc, HCM
Hiep Phu, Quan 9, HCM
...
Run Code Online (Sandbox Code Playgroud)
即使我的代码正在运行,它看起来也很丑陋。
如何避免这些嵌套的 for 循环?
您的数据结构是自然嵌套的,但是您可以选择一种用于整理代码的方法是编写一个生成器函数来对其进行迭代:
def all_wards(data):
for province in data:
for district in province['districts']:
for ward in district['wards']:
yield province, district, ward
Run Code Online (Sandbox Code Playgroud)
此函数与您当前拥有的三重嵌套循环相同,但在代码中的其他任何地方,您现在都可以使用单个非嵌套循环遍历数据结构:
for province, district, ward in all_wards(data):
print('{}, {}, {}'.format(ward['name'], district['name'], province['name']))
Run Code Online (Sandbox Code Playgroud)
如果您希望避免过多的缩进,这里是编写函数的等效方法,类似于@adarian 的答案,但不创建临时列表:
def all_wards(data):
return (
province, district, ward
for province in data
for district in province['districts']
for ward in district['wards']
)
Run Code Online (Sandbox Code Playgroud)