我的循环在烧瓶中的多个列表差异大小中混淆
my loop are confuse in multiple list difference size in flask
我想要这样的结果:
1:
2:
3: 3 p3 33
4: 4 p4 44
....
...
但我得到的是
1:
2:
3: 3 p3 33
3: 4 p4 44
3: 7 p7 77
...
这是我的python代码
str1 = [3,4,7,9]
n_save = ['p3','p4','p7','p9']
d_save = ['33','44','77','99']
zipped = zip(str1,n_save,d_save)
# flask code
{% for i in range(0,10) %}<br>
{% if i+1 in str1|list %}
{% for numm,namee,dd in zipped %}
<option value="{{ i+1 }}"> {{ i+1 }} : {{ namee }} {{ dd }}</option>
{% endfor %}
{% else %}
<option value="{{ i+1 }}"> {{ i+1 }} : </option>
{% endif %}
{% endfor %}
感谢任何帮助。
您的问题在
<option value="{{ i+1 }}"> {{ i+1 }} : {{ namee }} {{ dd }}</option>
% endfor %}
您正在遍历整个压缩数组,该数组当前为 [(3, 'p3', '33'), (4, 'p4', '44'), (7, 'p7', '77'), (9, 'p9', '99')]
你想要的是只获取特定位置的元组成员,即
如果i+1 = 3在str1的位置0,那么只得到zipped[0]的值
如果i+1 = 4在str1的位置1,那么只得到zipped[1]的值
尝试
<!-- first convert to a list -->
{% set k = zipped|list %}
{% for i in range(0,10) %}<br>
{% if i+1 in str1|list %}
<!-- find the position of i + 1 -->
{% set j = str1.index(i+1) %}
<!-- get the value at that position -->
{% set l = k[j] %}
<option value="{{ i+1 }}"> {{ i+1 }} : {{ l[0] }} {{ l[1] }} {{l[2]}}</option>
{% else %}
<option value="{{ i+1 }}"> {{ i+1 }} : </option>
{% endif %}
{% endfor %}
测试了这个并得到了
1
2
3 : 3 p3 33
4 : 4 p4 44
5
6
7 : 7 p7 77
在下面的示例中,首先将迭代器转换为列表。
然后使用 namespace.
创建指向压缩列表当前索引的指针
现在可以解压列表的相应条目了。
{% set data = zipped | list -%}
{% set ctx = namespace(index0=0) -%}
{% for i in range(1,11) -%}
{% if ctx.index0 < (data | length) and i == data[ctx.index0][0] -%}
{% set _, namee, dd = data[ctx.index0] -%}
<option value="{{ i }}">{{ i }} : {{ namee }} {{ dd }}</option>
{% set ctx.index0 = ctx.index0 + 1 -%}
{% else -%}
<option value="{{ i }}">{{ i }} : </option>
{% endif -%}
{% endfor -%}
我想要这样的结果:
1:
2:
3: 3 p3 33
4: 4 p4 44
....
...
但我得到的是
1:
2:
3: 3 p3 33
3: 4 p4 44
3: 7 p7 77
...
这是我的python代码
str1 = [3,4,7,9]
n_save = ['p3','p4','p7','p9']
d_save = ['33','44','77','99']
zipped = zip(str1,n_save,d_save)
# flask code
{% for i in range(0,10) %}<br>
{% if i+1 in str1|list %}
{% for numm,namee,dd in zipped %}
<option value="{{ i+1 }}"> {{ i+1 }} : {{ namee }} {{ dd }}</option>
{% endfor %}
{% else %}
<option value="{{ i+1 }}"> {{ i+1 }} : </option>
{% endif %}
{% endfor %}
感谢任何帮助。
您的问题在
<option value="{{ i+1 }}"> {{ i+1 }} : {{ namee }} {{ dd }}</option>
% endfor %}
您正在遍历整个压缩数组,该数组当前为 [(3, 'p3', '33'), (4, 'p4', '44'), (7, 'p7', '77'), (9, 'p9', '99')]
你想要的是只获取特定位置的元组成员,即
如果i+1 = 3在str1的位置0,那么只得到zipped[0]的值
如果i+1 = 4在str1的位置1,那么只得到zipped[1]的值
尝试
<!-- first convert to a list -->
{% set k = zipped|list %}
{% for i in range(0,10) %}<br>
{% if i+1 in str1|list %}
<!-- find the position of i + 1 -->
{% set j = str1.index(i+1) %}
<!-- get the value at that position -->
{% set l = k[j] %}
<option value="{{ i+1 }}"> {{ i+1 }} : {{ l[0] }} {{ l[1] }} {{l[2]}}</option>
{% else %}
<option value="{{ i+1 }}"> {{ i+1 }} : </option>
{% endif %}
{% endfor %}
测试了这个并得到了
1
2
3 : 3 p3 33
4 : 4 p4 44
5
6
7 : 7 p7 77
在下面的示例中,首先将迭代器转换为列表。
然后使用 namespace.
创建指向压缩列表当前索引的指针
现在可以解压列表的相应条目了。
{% set data = zipped | list -%}
{% set ctx = namespace(index0=0) -%}
{% for i in range(1,11) -%}
{% if ctx.index0 < (data | length) and i == data[ctx.index0][0] -%}
{% set _, namee, dd = data[ctx.index0] -%}
<option value="{{ i }}">{{ i }} : {{ namee }} {{ dd }}</option>
{% set ctx.index0 = ctx.index0 + 1 -%}
{% else -%}
<option value="{{ i }}">{{ i }} : </option>
{% endif -%}
{% endfor -%}