<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>ramdyne (Posts about iterator)</title><link>https://www.ramdyne.nl/</link><description></description><atom:link href="https://www.ramdyne.nl/categories/iterator.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><lastBuildDate>Sat, 07 Mar 2026 00:09:00 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>web.py and nested for loops</title><link>https://www.ramdyne.nl/posts/web-py-and-nested-for-loops/</link><dc:creator>ramdyne</dc:creator><description>&lt;p&gt;Lately I've been playing around with &amp;lt;a href="&lt;a class="reference external" href="http://www.python.org/"&gt;http://www.python.org/&lt;/a&gt;"&amp;gt;Python&amp;lt;/a&amp;gt; and a Python based web framework called &amp;lt;a href="&lt;a class="reference external" href="http://webpy.org/"&gt;http://webpy.org/&lt;/a&gt;"&amp;gt;web.py&amp;lt;/a&amp;gt;. Today I tried to do something seemingly very simple but ran in a problem I've had before but couldn't find a way around it, unlike last times.&lt;/p&gt;
&lt;p&gt;Suppose you have a web.py template that looks a little like this:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code python"&gt;&lt;a id="rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-1" name="rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-1" href="https://www.ramdyne.nl/posts/web-py-and-nested-for-loops/#rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-1"&gt;&lt;/a&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;with&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ratelists&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-2" name="rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-2" href="https://www.ramdyne.nl/posts/web-py-and-nested-for-loops/#rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-2"&gt;&lt;/a&gt;       &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-3" name="rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-3" href="https://www.ramdyne.nl/posts/web-py-and-nested-for-loops/#rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-3"&gt;&lt;/a&gt;            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tr&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;Filename&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;date_uploaded&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;date_imported&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;tr&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-4" name="rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-4" href="https://www.ramdyne.nl/posts/web-py-and-nested-for-loops/#rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-4"&gt;&lt;/a&gt;
&lt;a id="rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-5" name="rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-5" href="https://www.ramdyne.nl/posts/web-py-and-nested-for-loops/#rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-5"&gt;&lt;/a&gt;        &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a id="rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-6" name="rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-6" href="https://www.ramdyne.nl/posts/web-py-and-nested-for-loops/#rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-6"&gt;&lt;/a&gt;
&lt;a id="rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-7" name="rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-7" href="https://www.ramdyne.nl/posts/web-py-and-nested-for-loops/#rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-7"&gt;&lt;/a&gt;                &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tr&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;date_uploaded&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;date_imported&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-8" name="rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-8" href="https://www.ramdyne.nl/posts/web-py-and-nested-for-loops/#rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-8"&gt;&lt;/a&gt;
&lt;a id="rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-9" name="rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-9" href="https://www.ramdyne.nl/posts/web-py-and-nested-for-loops/#rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-9"&gt;&lt;/a&gt;                &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;select&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"importinlist"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-10" name="rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-10" href="https://www.ramdyne.nl/posts/web-py-and-nested-for-loops/#rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-10"&gt;&lt;/a&gt;
&lt;a id="rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-11" name="rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-11" href="https://www.ramdyne.nl/posts/web-py-and-nested-for-loops/#rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-11"&gt;&lt;/a&gt;                &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;lists&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a id="rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-12" name="rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-12" href="https://www.ramdyne.nl/posts/web-py-and-nested-for-loops/#rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-12"&gt;&lt;/a&gt;
&lt;a id="rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-13" name="rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-13" href="https://www.ramdyne.nl/posts/web-py-and-nested-for-loops/#rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-13"&gt;&lt;/a&gt;                        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;option&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"$list.list_id"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;option&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-14" name="rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-14" href="https://www.ramdyne.nl/posts/web-py-and-nested-for-loops/#rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-14"&gt;&lt;/a&gt;
&lt;a id="rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-15" name="rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-15" href="https://www.ramdyne.nl/posts/web-py-and-nested-for-loops/#rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-15"&gt;&lt;/a&gt;                &lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;select&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-16" name="rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-16" href="https://www.ramdyne.nl/posts/web-py-and-nested-for-loops/#rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-16"&gt;&lt;/a&gt;
&lt;a id="rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-17" name="rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-17" href="https://www.ramdyne.nl/posts/web-py-and-nested-for-loops/#rest_code_b8a9c03ce75f438ba7f5fe5ea26e7454-17"&gt;&lt;/a&gt;        &lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;For some reason the first time the outermost loop was entered, the innermost loop was executed fully, but the second time the outer loop ran, the inner loop resulted in an empty dropdown box. Searching for problems with nested for loops in web.py gave no obvious results. In desperation I started looking through the web.py Google Groups and found a &amp;lt;a href="&lt;a class="reference external" href="https://groups.google.com/group/webpy/browse_thread/thread"&gt;https://groups.google.com/group/webpy/browse_thread/thread&lt;/a&gt;/5bd21de793b146c7#"&amp;gt;post hinting at my problem&amp;lt;/a&amp;gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;gt; db.select returns webpy's flavored iterator, to get a list from it
&amp;gt;
&amp;gt; wrap the result in list()&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;and&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;gt; You can even do this:
&amp;gt; &lt;cite&gt;p = db.select(person).list()&lt;/cite&gt;
&amp;gt; I find it more convenient than wrapping it in list(...).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It appears that &lt;cite&gt;db.select()&lt;/cite&gt; is returning an iterator instead of a list. Once an
iterator has reached the end it will obviously not return to the first element
so the behaviour described above is exactly as should be expected, but not what
I wanted. Adding a &lt;cite&gt;.list()&lt;/cite&gt; call to &lt;cite&gt;db.select()&lt;/cite&gt; and supplying the result to the template above made all my problems go away. I now have dozens of filled dropdowns on my webpage.&lt;/p&gt;
&lt;p&gt;So my problem was not with the nested for loops, they were working perfectly. I
didn't know results from a web.py database query were an iterator...&lt;/p&gt;</description><category>code</category><category>english</category><category>for</category><category>general</category><category>iterator</category><category>list</category><category>loop</category><category>loops</category><category>nested</category><category>nested loop</category><category>python</category><category>web</category><category>web.py</category><guid>https://www.ramdyne.nl/posts/web-py-and-nested-for-loops/</guid><pubDate>Sun, 19 Feb 2012 17:17:24 GMT</pubDate></item></channel></rss>