|
5 | 5 | <link href="https://learnbyexample.github.io/atom.xml" rel="self" type="application/atom+xml"/>
|
6 | 6 | <link href="https://learnbyexample.github.io"/>
|
7 | 7 | <generator uri="https://www.getzola.org/">Zola</generator>
|
8 |
| - <updated>2023-02-04T00:00:00+00:00</updated> |
| 8 | + <updated>2023-02-07T00:00:00+00:00</updated> |
9 | 9 | <id>https://learnbyexample.github.io/atom.xml</id>
|
| 10 | + <entry xml:lang="en"> |
| 11 | + <title>Python tip 23: map, filter and reduce</title> |
| 12 | + <published>2023-02-07T00:00:00+00:00</published> |
| 13 | + <updated>2023-02-07T00:00:00+00:00</updated> |
| 14 | + <link rel="alternate" href="https://learnbyexample.github.io/tips/python-tip-23/" type="text/html"/> |
| 15 | + <id>https://learnbyexample.github.io/tips/python-tip-23/</id> |
| 16 | + <content type="html"><p>Many operations on container objects can be defined in terms of these three concepts. For example, if you want to sum the square of all even numbers:</p> |
| 17 | +<ul> |
| 18 | +<li>separating out even numbers is <strong>Filter</strong> (i.e. only elements that satisfy a condition are retained)</li> |
| 19 | +<li>square of such numbers is <strong>Map</strong> (i.e. each element is transformed by a mapping function)</li> |
| 20 | +<li>final sum is <strong>Reduce</strong> (i.e. you get one value out of multiple values)</li> |
| 21 | +</ul> |
| 22 | +<p>One or more of these operations may be absent depending on the problem statement. Each of these steps will be first illustrated using straightforward code and then the equivalent list comprehensions (and generator expressions) are also shown.</p> |
| 23 | +<p>The first of these steps could look like:</p> |
| 24 | +<pre data-lang="python" style="background-color:#f5f5f5;color:#1f1f1f;" class="language-python "><code class="language-python" data-lang="python"><span style="color:#72ab00;">&gt;&gt;&gt; </span><span style="background-color:#562d56bf;color:#f8f8f8;">def</span><span> </span><span style="color:#5597d6;">get_evens</span><span>(iterable): |
| 25 | +</span><span style="color:#b3933a;">... </span><span>op </span><span style="color:#72ab00;">= </span><span>[] |
| 26 | +</span><span style="color:#b3933a;">... </span><span style="color:#72ab00;">for </span><span>n </span><span style="color:#72ab00;">in </span><span>iterable: |
| 27 | +</span><span style="color:#b3933a;">... </span><span style="color:#72ab00;">if </span><span>n </span><span style="color:#72ab00;">% </span><span style="color:#b3933a;">2 </span><span style="color:#72ab00;">== </span><span style="color:#b3933a;">0</span><span>: |
| 28 | +</span><span style="color:#b3933a;">... </span><span>op.</span><span style="color:#5597d6;">append</span><span>(n) |
| 29 | +</span><span style="color:#b3933a;">... </span><span style="color:#72ab00;">return </span><span>op |
| 30 | +</span><span style="color:#b3933a;">... |
| 31 | +</span><span style="color:#72ab00;">&gt;&gt;&gt; </span><span>nums </span><span style="color:#72ab00;">= </span><span>[</span><span style="color:#b3933a;">100</span><span>, </span><span style="color:#b3933a;">53</span><span>, </span><span style="color:#b3933a;">32</span><span>, </span><span style="color:#b3933a;">0</span><span>, </span><span style="color:#b3933a;">11</span><span>, </span><span style="color:#b3933a;">5</span><span>, </span><span style="color:#b3933a;">2</span><span>] |
| 32 | +</span><span style="color:#72ab00;">&gt;&gt;&gt; </span><span style="color:#5597d6;">get_evens</span><span>(nums) |
| 33 | +</span><span>[</span><span style="color:#b3933a;">100</span><span>, </span><span style="color:#b3933a;">32</span><span>, </span><span style="color:#b3933a;">0</span><span>, </span><span style="color:#b3933a;">2</span><span>] |
| 34 | +</span><span> |
| 35 | +</span><span style="color:#72ab00;">&gt;&gt;&gt; </span><span>[n </span><span style="color:#72ab00;">for </span><span>n </span><span style="color:#72ab00;">in </span><span>nums </span><span style="color:#72ab00;">if </span><span>n </span><span style="color:#72ab00;">% </span><span style="color:#b3933a;">2 </span><span style="color:#72ab00;">== </span><span style="color:#b3933a;">0</span><span>] |
| 36 | +</span><span>[</span><span style="color:#b3933a;">100</span><span>, </span><span style="color:#b3933a;">32</span><span>, </span><span style="color:#b3933a;">0</span><span>, </span><span style="color:#b3933a;">2</span><span>] |
| 37 | +</span></code></pre> |
| 38 | +<p>The second step could be:</p> |
| 39 | +<pre data-lang="python" style="background-color:#f5f5f5;color:#1f1f1f;" class="language-python "><code class="language-python" data-lang="python"><span style="color:#72ab00;">&gt;&gt;&gt; </span><span style="background-color:#562d56bf;color:#f8f8f8;">def</span><span> </span><span style="color:#5597d6;">sqr_evens</span><span>(iterable): |
| 40 | +</span><span style="color:#b3933a;">... </span><span>op </span><span style="color:#72ab00;">= </span><span>[] |
| 41 | +</span><span style="color:#b3933a;">... </span><span style="color:#72ab00;">for </span><span>n </span><span style="color:#72ab00;">in </span><span>iterable: |
| 42 | +</span><span style="color:#b3933a;">... </span><span style="color:#72ab00;">if </span><span>n </span><span style="color:#72ab00;">% </span><span style="color:#b3933a;">2 </span><span style="color:#72ab00;">== </span><span style="color:#b3933a;">0</span><span>: |
| 43 | +</span><span style="color:#b3933a;">... </span><span>op.</span><span style="color:#5597d6;">append</span><span>(n </span><span style="color:#72ab00;">* </span><span>n) |
| 44 | +</span><span style="color:#b3933a;">... </span><span style="color:#72ab00;">return </span><span>op |
| 45 | +</span><span style="color:#b3933a;">... |
| 46 | +</span><span style="color:#72ab00;">&gt;&gt;&gt; </span><span style="color:#5597d6;">sqr_evens</span><span>(nums) |
| 47 | +</span><span>[</span><span style="color:#b3933a;">10000</span><span>, </span><span style="color:#b3933a;">1024</span><span>, </span><span style="color:#b3933a;">0</span><span>, </span><span style="color:#b3933a;">4</span><span>] |
| 48 | +</span><span> |
| 49 | +</span><span style="color:#72ab00;">&gt;&gt;&gt; </span><span>[n </span><span style="color:#72ab00;">* </span><span>n </span><span style="color:#72ab00;">for </span><span>n </span><span style="color:#72ab00;">in </span><span>nums </span><span style="color:#72ab00;">if </span><span>n </span><span style="color:#72ab00;">% </span><span style="color:#b3933a;">2 </span><span style="color:#72ab00;">== </span><span style="color:#b3933a;">0</span><span>] |
| 50 | +</span><span>[</span><span style="color:#b3933a;">10000</span><span>, </span><span style="color:#b3933a;">1024</span><span>, </span><span style="color:#b3933a;">0</span><span>, </span><span style="color:#b3933a;">4</span><span>] |
| 51 | +</span></code></pre> |
| 52 | +<p>And finally, the third step could be:</p> |
| 53 | +<pre data-lang="python" style="background-color:#f5f5f5;color:#1f1f1f;" class="language-python "><code class="language-python" data-lang="python"><span style="color:#72ab00;">&gt;&gt;&gt; </span><span style="background-color:#562d56bf;color:#f8f8f8;">def</span><span> </span><span style="color:#5597d6;">sum_sqr_evens</span><span>(iterable): |
| 54 | +</span><span style="color:#b3933a;">... </span><span>total </span><span style="color:#72ab00;">= </span><span style="color:#b3933a;">0 |
| 55 | +</span><span style="color:#b3933a;">... </span><span style="color:#72ab00;">for </span><span>n </span><span style="color:#72ab00;">in </span><span>iterable: |
| 56 | +</span><span style="color:#b3933a;">... </span><span style="color:#72ab00;">if </span><span>n </span><span style="color:#72ab00;">% </span><span style="color:#b3933a;">2 </span><span style="color:#72ab00;">== </span><span style="color:#b3933a;">0</span><span>: |
| 57 | +</span><span style="color:#b3933a;">... </span><span>total </span><span style="color:#72ab00;">+= </span><span>n </span><span style="color:#72ab00;">* </span><span>n |
| 58 | +</span><span style="color:#b3933a;">... </span><span style="color:#72ab00;">return </span><span>total |
| 59 | +</span><span style="color:#b3933a;">... |
| 60 | +</span><span style="color:#72ab00;">&gt;&gt;&gt; </span><span style="color:#5597d6;">sum_sqr_evens</span><span>(nums) |
| 61 | +</span><span style="color:#b3933a;">11028 |
| 62 | +</span><span> |
| 63 | +</span><span style="color:#72ab00;">&gt;&gt;&gt; </span><span style="color:#b39f04;">sum</span><span>(n </span><span style="color:#72ab00;">* </span><span>n </span><span style="color:#72ab00;">for </span><span>n </span><span style="color:#72ab00;">in </span><span>nums </span><span style="color:#72ab00;">if </span><span>n </span><span style="color:#72ab00;">% </span><span style="color:#b3933a;">2 </span><span style="color:#72ab00;">== </span><span style="color:#b3933a;">0</span><span>) |
| 64 | +</span><span style="color:#b3933a;">11028 |
| 65 | +</span></code></pre> |
| 66 | +<p><img src="/images/info.svg" alt="info" /> You can also use <a href="https://docs.python.org/3/library/functions.html#map">map()</a>, <a href="https://docs.python.org/3/library/functions.html#filter">filter()</a> and <a href="https://docs.python.org/3/library/functools.html#functools.reduce">functools.reduce()</a> for such problems.</p> |
| 67 | +<p><strong>Video demo</strong>:</p> |
| 68 | +<p align="center"><iframe width="560" height="315" loading="lazy" src="https://www.youtube.com/embed/jB4cazhpThA" title="YouTube video player" frameborder="0" allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></p> |
| 69 | +<br> |
| 70 | +<p><img src="/images/info.svg" alt="info" /> See also my <a href="https://github.com/learnbyexample/100_page_python_intro">100 Page Python Intro</a> ebook.</p> |
| 71 | +</content> |
| 72 | + </entry> |
10 | 73 | <entry xml:lang="en">
|
11 | 74 | <title>Vim tip 21: working with tabs</title>
|
12 | 75 | <published>2023-02-01T00:00:00+00:00</published>
|
|
0 commit comments