https://dailystuff.nlDailystuff on the Internet - Posts tagged learning2024-03-16T09:59:04.465876+00:00ABloghttps://dailystuff.nl/blog/2022/find-longest-item-in-list.htmlFinding the longest or shortest item in a list2022-05-26T00:00:00+00:00Hans Spaans<section id="finding-the-longest-or-shortest-item-in-a-list">
<p>Python is a powerful language to quickly and efficiently do work with data, but it requires a more in-depth knowledge of the language to write more elegant and readable code. For many new Python programmers, this is a catch-22 as they’re still learning all the details and it takes time. Let’s take a simple example about finding the longest string in a list and simplify some code. Secondly making the code faster as we will use built-in functions at machine speed instead of interpreting Python code.</p>
<p>The example is a for-loop over a list and checks if the new item is longer than the current longest item before it stores it as the longest. Afterward, it prints the result which will be <code class="docutils literal notranslate"><span class="pre">longest</span></code> in this case.</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="ch">#!/usr/bin/env python3</span>
<span class="linenos"> 2</span>
<span class="linenos"> 3</span><span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
<span class="linenos"> 4</span> <span class="n">mylist</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"find"</span><span class="p">,</span> <span class="s2">"longest"</span><span class="p">,</span> <span class="s2">"item"</span><span class="p">,</span> <span class="s2">"in"</span><span class="p">,</span> <span class="s2">"the"</span><span class="p">,</span> <span class="s2">"list"</span><span class="p">]</span>
<span class="linenos"> 5</span>
<span class="linenos"> 6</span> <span class="n">word</span> <span class="o">=</span> <span class="s2">""</span>
<span class="linenos"> 7</span> <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">mylist</span><span class="p">:</span>
<span class="linenos"> 8</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">item</span><span class="p">)</span> <span class="o">></span> <span class="nb">len</span><span class="p">(</span><span class="n">word</span><span class="p">):</span>
<span class="linenos"> 9</span> <span class="n">word</span> <span class="o">=</span> <span class="n">item</span>
<span class="linenos">10</span> <span class="nb">print</span><span class="p">(</span><span class="n">word</span><span class="p">)</span>
<span class="linenos">11</span>
<span class="linenos">12</span>
<span class="linenos">13</span><span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">"__main__"</span><span class="p">:</span>
<span class="linenos">14</span> <span class="n">main</span><span class="p">()</span>
</pre></div>
</div>
<section id="using-builtin-functions">
<h2>Using builtin functions</h2>
<p>Python has built-in functions called <a class="reference external" href="https://docs.python.org/3/library/functions.html#min" title="(in Python v3.12)"><code class="xref py py-func docutils literal notranslate"><span class="pre">min()</span></code></a> and <a class="reference external" href="https://docs.python.org/3/library/functions.html#max" title="(in Python v3.12)"><code class="xref py py-func docutils literal notranslate"><span class="pre">max()</span></code></a> to find the smallest or biggest value in a list. In the example below the <a class="reference external" href="https://docs.python.org/3/library/functions.html#max" title="(in Python v3.12)"><code class="xref py py-func docutils literal notranslate"><span class="pre">max()</span></code></a> function is used to find the biggest numerical value and <a class="reference external" href="https://docs.python.org/3/library/functions.html#min" title="(in Python v3.12)"><code class="xref py py-func docutils literal notranslate"><span class="pre">min()</span></code></a> for the smallest numerical value.</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="ch">#!/usr/bin/env python3</span>
<span class="linenos"> 2</span>
<span class="linenos"> 3</span><span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
<span class="linenos"> 4</span> <span class="n">mylist</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">4</span><span class="p">]</span>
<span class="linenos"> 5</span>
<span class="linenos"> 6</span> <span class="n">max_value</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">mylist</span><span class="p">)</span>
<span class="linenos"> 7</span> <span class="n">min_value</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">mylist</span><span class="p">)</span>
<span class="linenos"> 8</span> <span class="nb">print</span><span class="p">(</span><span class="n">min_value</span><span class="p">)</span>
<span class="linenos"> 9</span> <span class="nb">print</span><span class="p">(</span><span class="n">max_value</span><span class="p">)</span>
<span class="linenos">10</span>
<span class="linenos">11</span>
<span class="linenos">12</span><span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">"__main__"</span><span class="p">:</span>
<span class="linenos">13</span> <span class="n">main</span><span class="p">()</span>
</pre></div>
</div>
<p>As expected the output is <code class="docutils literal notranslate"><span class="pre">1</span></code> for the lowest value, and <code class="docutils literal notranslate"><span class="pre">5</span></code> as it is the highest value in the list.</p>
<div class="highlight-text notranslate"><div class="highlight"><pre><span></span>1
5
</pre></div>
</div>
</section>
<section id="handling-an-empty-sequence">
<h2>Handling an empty sequence</h2>
<p>Using the built-in functions <a class="reference external" href="https://docs.python.org/3/library/functions.html#min" title="(in Python v3.12)"><code class="xref py py-func docutils literal notranslate"><span class="pre">min()</span></code></a> and <a class="reference external" href="https://docs.python.org/3/library/functions.html#max" title="(in Python v3.12)"><code class="xref py py-func docutils literal notranslate"><span class="pre">max()</span></code></a> will fail with <code class="docutils literal notranslate"><span class="pre">ValueError:</span> <span class="pre">max()</span> <span class="pre">arg</span> <span class="pre">is</span> <span class="pre">an</span> <span class="pre">empty</span> <span class="pre">sequence</span></code> if an empty sequence is used. Setting the default value to <code class="docutils literal notranslate"><span class="pre">0</span></code> will be returned when the sequence is empty. In the original example, we set the variable <code class="docutils literal notranslate"><span class="pre">word</span></code> to an empty string as the default value.</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="ch">#!/usr/bin/env python3</span>
<span class="linenos"> 2</span>
<span class="linenos"> 3</span><span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
<span class="linenos"> 4</span> <span class="n">mylist</span> <span class="o">=</span> <span class="p">[]</span>
<span class="linenos"> 5</span>
<span class="linenos"> 6</span> <span class="n">value</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">mylist</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
<span class="linenos"> 7</span> <span class="nb">print</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="linenos"> 8</span>
<span class="linenos"> 9</span>
<span class="linenos">10</span><span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">"__main__"</span><span class="p">:</span>
<span class="linenos">11</span> <span class="n">main</span><span class="p">()</span>
</pre></div>
</div>
</section>
<section id="finding-the-longest-item">
<h2>Finding the longest item</h2>
<p>Now that we know about the <a class="reference external" href="https://docs.python.org/3/library/functions.html#max" title="(in Python v3.12)"><code class="xref py py-func docutils literal notranslate"><span class="pre">max()</span></code></a> function and how to handle empty sequences or a list in our example it is time to implement it. One key item still missing is that <a class="reference external" href="https://docs.python.org/3/library/functions.html#max" title="(in Python v3.12)"><code class="xref py py-func docutils literal notranslate"><span class="pre">max()</span></code></a> works with numerical values so we have to score all elements with a numerical value. The function <a class="reference external" href="https://docs.python.org/3/library/functions.html#max" title="(in Python v3.12)"><code class="xref py py-func docutils literal notranslate"><span class="pre">max()</span></code></a> has another option called <code class="docutils literal notranslate"><span class="pre">key</span></code> which can give a function to score the element and with function <a class="reference external" href="https://docs.python.org/3/library/functions.html#len" title="(in Python v3.12)"><code class="xref py py-func docutils literal notranslate"><span class="pre">len()</span></code></a> the length of a string element can be determined.</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="ch">#!/usr/bin/env python3</span>
<span class="linenos"> 2</span>
<span class="linenos"> 3</span><span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
<span class="linenos"> 4</span> <span class="n">mylist</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"find"</span><span class="p">,</span> <span class="s2">"longest"</span><span class="p">,</span> <span class="s2">"item"</span><span class="p">,</span> <span class="s2">"in"</span><span class="p">,</span> <span class="s2">"the"</span><span class="p">,</span> <span class="s2">"list"</span><span class="p">]</span>
<span class="linenos"> 5</span>
<span class="linenos"> 6</span> <span class="n">word</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">mylist</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="nb">len</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s2">""</span><span class="p">)</span>
<span class="linenos"> 7</span> <span class="nb">print</span><span class="p">(</span><span class="n">word</span><span class="p">)</span>
<span class="linenos"> 8</span>
<span class="linenos"> 9</span>
<span class="linenos">10</span><span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">"__main__"</span><span class="p">:</span>
<span class="linenos">11</span> <span class="n">main</span><span class="p">()</span>
</pre></div>
</div>
<p>Running example and prints the same result as in the original example we started with, but we reduced four-line into just one.</p>
<div class="highlight-text notranslate"><div class="highlight"><pre><span></span>longest
</pre></div>
</div>
</section>
<section id="finding-the-shortest-item">
<h2>Finding the shortest item</h2>
<p>By using the <a class="reference external" href="https://docs.python.org/3/library/functions.html#min" title="(in Python v3.12)"><code class="xref py py-func docutils literal notranslate"><span class="pre">min()</span></code></a> function we can find the shortest string in list and we didn’t had to rewrite selection code for it. Here we see a benefit already as we can just switch from <a class="reference external" href="https://docs.python.org/3/library/functions.html#max" title="(in Python v3.12)"><code class="xref py py-func docutils literal notranslate"><span class="pre">max()</span></code></a> to <a class="reference external" href="https://docs.python.org/3/library/functions.html#min" title="(in Python v3.12)"><code class="xref py py-func docutils literal notranslate"><span class="pre">min()</span></code></a> without any other modifications.</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="ch">#!/usr/bin/env python3</span>
<span class="linenos"> 2</span>
<span class="linenos"> 3</span><span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
<span class="linenos"> 4</span> <span class="n">mylist</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"find"</span><span class="p">,</span> <span class="s2">"longest"</span><span class="p">,</span> <span class="s2">"item"</span><span class="p">,</span> <span class="s2">"in"</span><span class="p">,</span> <span class="s2">"the"</span><span class="p">,</span> <span class="s2">"list"</span><span class="p">]</span>
<span class="linenos"> 5</span>
<span class="linenos"> 6</span> <span class="n">word</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">mylist</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="nb">len</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s2">""</span><span class="p">)</span>
<span class="linenos"> 7</span> <span class="nb">print</span><span class="p">(</span><span class="n">word</span><span class="p">)</span>
<span class="linenos"> 8</span>
<span class="linenos"> 9</span>
<span class="linenos">10</span><span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">"__main__"</span><span class="p">:</span>
<span class="linenos">11</span> <span class="n">main</span><span class="p">()</span>
</pre></div>
</div>
</section>
<section id="changing-the-key-calculation">
<h2>Changing the key calculation</h2>
<p>In the previous examples, the <a class="reference external" href="https://docs.python.org/3/library/functions.html#len" title="(in Python v3.12)"><code class="xref py py-func docutils literal notranslate"><span class="pre">len()</span></code></a> function was used to calculate the key value based on the length of the string. Other functions can also be used to calculate the key-value and in the example below we create a custom function for this. The calc function sums up the ASCII values for all characters in the string and returns that.</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="ch">#!/usr/bin/env python3</span>
<span class="linenos"> 2</span>
<span class="linenos"> 3</span><span class="k">def</span> <span class="nf">calc</span><span class="p">(</span><span class="n">word</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="nb">int</span><span class="p">:</span>
<span class="linenos"> 4</span> <span class="k">return</span> <span class="nb">sum</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">ord</span><span class="p">,</span> <span class="n">word</span><span class="p">)))</span>
<span class="linenos"> 5</span>
<span class="linenos"> 6</span>
<span class="linenos"> 7</span><span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
<span class="linenos"> 8</span> <span class="n">mylist</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"aa"</span><span class="p">,</span> <span class="s2">"ab"</span><span class="p">,</span> <span class="s2">"ac"</span><span class="p">,</span> <span class="s2">"ba"</span><span class="p">]</span>
<span class="linenos"> 9</span>
<span class="linenos">10</span> <span class="n">word</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">mylist</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="n">calc</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s2">""</span><span class="p">)</span>
<span class="linenos">11</span> <span class="nb">print</span><span class="p">(</span><span class="n">word</span><span class="p">)</span>
<span class="linenos">12</span>
<span class="linenos">13</span>
<span class="linenos">14</span><span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">"__main__"</span><span class="p">:</span>
<span class="linenos">15</span> <span class="n">main</span><span class="p">()</span>
</pre></div>
</div>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>The function <a class="reference external" href="https://docs.python.org/3/library/functions.html#ord" title="(in Python v3.12)"><code class="xref py py-func docutils literal notranslate"><span class="pre">ord()</span></code></a> converts an ASCII character to an integer, and <a class="reference external" href="https://docs.python.org/3/library/functions.html#map" title="(in Python v3.12)"><code class="xref py py-func docutils literal notranslate"><span class="pre">map()</span></code></a> function iterates a function over a list.</p>
</div>
<p>A shorter way to write this is to use a <a class="reference external" href="https://docs.python.org/3/reference/expressions.html#lambda" title="(in Python v3.12)"><span class="xref std std-ref">lamba</span></a> function and keep the function close to where it is used and making it more readable.</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="ch">#!/usr/bin/env python3</span>
<span class="linenos"> 2</span>
<span class="linenos"> 3</span><span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
<span class="linenos"> 4</span> <span class="n">mylist</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"aa"</span><span class="p">,</span> <span class="s2">"ab"</span><span class="p">,</span> <span class="s2">"ac"</span><span class="p">,</span> <span class="s2">"ba"</span><span class="p">]</span>
<span class="linenos"> 5</span>
<span class="linenos"> 6</span> <span class="n">word</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">mylist</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="p">(</span><span class="k">lambda</span> <span class="n">value</span><span class="p">:</span> <span class="nb">sum</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">ord</span><span class="p">,</span> <span class="n">value</span><span class="p">)))),</span> <span class="n">default</span><span class="o">=</span><span class="s2">""</span><span class="p">)</span>
<span class="linenos"> 7</span> <span class="nb">print</span><span class="p">(</span><span class="n">word</span><span class="p">)</span>
<span class="linenos"> 8</span>
<span class="linenos"> 9</span>
<span class="linenos">10</span><span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">"__main__"</span><span class="p">:</span>
<span class="linenos">11</span> <span class="n">main</span><span class="p">()</span>
</pre></div>
</div>
<p>In both examples, the outcome is <code class="docutils literal notranslate"><span class="pre">ac</span></code> as it has the biggest numerical value if both ASCII values are summed up.</p>
</section>
<section id="conclusions-about-finding-in-lists">
<h2>Conclusions about finding in lists</h2>
<p>In the original example, we started with a custom piece of code to select an element from a list and replaced it with built-in functions. With this, the code length was reduced and the complexity as well. These built-in functions have been tested extensively with every Python release and have optimized execution in C instead of Python, reducing the chance of bugs and slow code.</p>
</section>
</section>
Python is a powerful language to quickly and efficiently do work with data, but it requires a more in-depth knowledge of the language to write more elegant and readable code. For many new Python programmers, this is a catch-22 as they’re still learning all the details and it takes time. Let’s take a simple example about finding the longest string in a list and simplify some code. Secondly making the code faster as we will use built-in functions at machine speed instead of interpreting Python code.The example is a for-loop over a list and checks if the new item is longer than the current longest item before it stores it as the longest. Afterward, it prints the result which will be longest in this case.2022-05-26T00:00:00+00:00