Django嵌套双zip循环报错:需解包2个值却仅得1个,求解决方法
修复Django模板嵌套循环的解包错误
在views.py中定义了以下代码:
mylist1 = ["peru", "germany", "japan"] mylist2 = [["lima","cusco"], ["berlin","munich"], ["tokyo"]] mylist3 = [[1,2], [3,4], [5]] mylist = zip(mylist1, zip(mylist2, mylist3))
在Django模板中编写了嵌套for循环:
{% for country, info in mylist %} {{ country }} {% for city, number in info %} {{ city }} {{ number }} {% endfor %} {% endfor %}
运行时出现错误:Need 2 values to unpack in for loop; got 1.
错误原因
当前mylist的结构是每个元素为(国家名称, (城市列表, 数字列表)),比如第一个元素是("peru", (["lima","cusco"], [1,2]))。模板内层循环遍历info时,会依次取出["lima","cusco"]和[1,2]这两个列表,尝试将单个列表解包为city和number,但单个列表是一个整体元素,无法拆成两个值,因此触发解包错误。
修复方案
需要调整mylist的结构,让每个国家对应的info是城市与数字一一配对的可迭代对象,而非两个独立列表的元组。可以通过以下两种方式实现:
使用生成器表达式嵌套zip:
mylist = zip(mylist1, (zip(cities, numbers) for cities, numbers in zip(mylist2, mylist3)))使用列表推导式更直观地构建结构:
mylist = [ (country, zip(cities, numbers)) for country, cities, numbers in zip(mylist1, mylist2, mylist3) ]
调整后,每个国家对应的info会是类似(("lima",1), ("cusco",2))的可迭代对象,模板中的内层循环就能正确将每个元素解包为city和number。
内容的提问来源于stack exchange,提问作者christian ortiz
相关产品推荐
相关产品推荐

