[Tut] Python: How to Count Elements in a List Matching a Condition? - Printable Version +- Sick Gaming (https://www.sickgaming.net) +-- Forum: Programming (https://www.sickgaming.net/forum-76.html) +--- Forum: Python (https://www.sickgaming.net/forum-83.html) +--- Thread: [Tut] Python: How to Count Elements in a List Matching a Condition? (/thread-94323.html) |
[Tut] Python: How to Count Elements in a List Matching a Condition? - xSicKxBot - 03-30-2020 Python: How to Count Elements in a List Matching a Condition? <div><p>I stumbled across this question when browsing through StackOverflow and it got me thinking: what’s the best way to count the number of elements in a list that match a certain condition? Can you generalize this way to both general conditions (e.g. <code>x>3</code>) and regular expressions (e.g. <code>'a.*'</code>)? </p> <figure class="wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"> <div class="wp-block-embed__wrapper"> <div class="ast-oembed-container"><iframe title="Python: How to Count Elements in a List Matching a Condition? [A No-BS Framework]" width="1400" height="788" src="https://www.youtube.com/embed/nOwGa4gRjFs?feature=oembed" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div> </div> </figure> <p><strong>Short answer: you can count the number of elements <code>x</code> that match a certain <code>condition(x)</code> by using the one-liner expression <code>sum(condition(x) for x in lst)</code>. This creates a generator expression that returns <code>True</code> for each element that satisfies the condition and <code>False</code> otherwise. Since the <code>True</code> and <code>False</code> values are represented by integer 1 and 0 values, you get the number of matching elements by summing over the iterable.</strong></p> <p>Try it yourself with the interactive code shell:</p> <figure class="wp-block-embed-wordpress wp-block-embed is-type-wp-embed is-provider-repl-it"> <div class="wp-block-embed__wrapper"> <iframe title="countCondition" class="wp-embedded-content" sandbox="allow-scripts" security="restricted" src="https://repl.it/@finxter/countCondition?lite=true#?secret=Wku9PHjial" data-secret="Wku9PHjial" width="800" height="600" frameborder="0"></iframe> </div> </figure> <p>In case, the browser interpreter doesn’t show up in your browser, here’s the raw Python code:</p> <pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">## FRAMEWORK FOR CONDITIONAL COUNT ## # Define any condition here def condition(x): return x > 10 # Create the list lst = [10, 11, 42, 1, 2, 3] # Count the number of matching elements print(sum(condition(x) for x in lst)) # What's the output?</pre> <p><strong>Related articles:</strong></p> <ul> <li><a href="https://blog.finxter.com/python-list-methods/" target="_blank" rel="noreferrer noopener">Python List Methods</a></li> <li><a href="https://blog.finxter.com/python-list-count/" target="_blank" rel="noreferrer noopener">Python List Count()</a></li> </ul> <h2>Python List Count With Condition</h2> <p>How can you count elements under a certain condition in <a href="https://blog.finxter.com/python-crash-course/" target="_blank" rel="noreferrer noopener">Python</a>? For example, what if you want to count all even values in a list? Or all prime numbers? Or all strings that start with a certain character? There are multiple ways to accomplish this, let’s discuss them one by one.</p> <p>Say, you have a condition for each element <code>x</code>. Let’s make it a function with the name <code>condition(x)</code>. You can define any condition you want—just put it in your function. For example this condition returns True for all elements that are greater than the integer 10:</p> <pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">def condition(x): return x > 10 print(condition(10)) # False print(condition(2)) # False print(condition(11)) # True </pre> <p>But you can also define more complicated conditions such as checking if they are prime numbers.</p> <h3>Python List Count If</h3> <p><strong>How can you count the elements of the list IF the condition is met?</strong></p> <p>The answer is to use a simple <a rel="noreferrer noopener" href="https://blog.finxter.com/python-one-line-for-loop-a-simple-tutorial/" target="_blank">generator expression</a> <code>sum(condition(x) for x in lst)</code>:</p> <pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">>>> def condition(x): return x>10 >>> lst = [10, 11, 42, 1, 2, 3] >>> sum(condition(x) for x in lst) 2</pre> <p>The result indicates that there are two elements that are larger than 10. You used a generator expression that returns an iterator of Booleans. Note that the Boolean <code>True</code> is represented by the integer value 1 and the Boolean <code>False</code> is represented by the integer value 0. That’s why you can simply calculate the sum over all Booleans to obtain the number of elements for which the condition holds. </p> <h3>Python List Count Greater / Smaller Than</h3> <p>If you want to determine the number of elements that are greater than or smaller than a specified value, just modify the condition in this example:</p> <pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">>>> def condition(x): return x>10 >>> lst = [10, 11, 42, 1, 2, 3] >>> sum(condition(x) for x in lst) 2</pre> <p>For example, to find the number of elements smaller than 5, use the condition x<5 in the generator expression:</p> <pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">>>> lst = [10, 11, 42, 1, 2, 3] >>> sum(x<5 for x in lst) 3</pre> <h3>Python List Count Zero / Non-Zero</h3> <p>To count the number of zeros in a given list, use the <code>list.count(0)</code> method call.</p> <p>To count the number of non-zeros in a given list, you should use <em>conditional counting </em>as discussed before:</p> <pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">def condition(x): return x!=0 lst = [10, 11, 42, 1, 2, 0, 0, 0] print(sum(condition(x) for x in lst)) # 5 </pre> <h3>Python List Count Lambda + Map</h3> <p>An alternative is to use a combination of the map and the lambda function. </p> <p><strong>Related articles:</strong></p> <ul> <li><a rel="noreferrer noopener" href="https://blog.finxter.com/how-to-get-rid-of-pythons-map-function-with-list-comprehension/" target="_blank">[Full Tutorial] Map Function</a>: manipulates each element in an iterable.</li> <li><a rel="noreferrer noopener" href="https://blog.finxter.com/a-simple-introduction-of-the-lambda-function-in-python/" target="_blank">[Full Tutorial] Lambda Function</a>: creates an anonymous function.</li> </ul> <p>Here’s the code:</p> <pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">>>> sum(map(lambda x: x%2==0, [1, 2, 3, 4, 5])) 2</pre> <p>You count the number of even integers in the list. </p> <ul> <li>The lambda function returns a truth value for a given element <code>x</code>. </li> <li>The map function transforms each list element into a Boolean value (1 or 0). </li> <li>The sum function sums up the “1”s. </li> </ul> <p>The result is the number of elements for which the condition evaluates to <code>True</code>.</p> <h2>Python List Count Regex / Count Matches</h2> <p>Given a list of strings. How can you check how many list elements match a certain regex pattern? <a rel="noreferrer noopener" href="https://blog.finxter.com/python-regex/" target="_blank">(If you need a refresher on Python regular expressions, check out my ultimate guide on this blo</a><a href="https://blog.finxter.com/python-regex/" target="_blank" rel="noreferrer noopener">g</a><a rel="noreferrer noopener" href="https://blog.finxter.com/python-regex/" target="_blank"> – it’s really ultimate!)</a></p> <ul> <li>List <code>lst</code> of string elements</li> <li>Pattern <code>p</code> to be matched against the strings in the list.</li> </ul> <p><strong>Solution</strong>: Use the concept of generator expressions with the ternary operator. </p> <p><strong>Related articles:</strong></p> <ul> <li><a rel="noreferrer noopener" href="https://blog.finxter.com/if-then-else-in-one-line-python/" target="_blank">Master ternary operator.</a></li> <li><a rel="noreferrer noopener" href="https://blog.finxter.com/list-comprehension/" target="_blank">Master list comprehension.</a></li> </ul> <p>Here’s the code:</p> <pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">>>> import re >>> p = 'a...e' >>> lst = ['annie', 'alice', 'apex'] >>> sum(1 if re.match(p, x) else 0 for x in lst) 2</pre> <h2>Python List Count Wildcard</h2> <p>Do you want to count all string occurrences of a given prefix (e.g. prefix <code>"Sus"</code> for strings <code>"Susie"</code>, <code>"Susy"</code>, <code>"Susi"</code>)?</p> <p><strong>Solution</strong>: Again you can use the concept of generator expressions with the ternary operator. </p> <p><strong>Related articles:</strong></p> <ul> <li><a rel="noreferrer noopener" href="https://blog.finxter.com/if-then-else-in-one-line-python/" target="_blank">Master ternary operator.</a></li> <li><a rel="noreferrer noopener" href="https://blog.finxter.com/list-comprehension/" target="_blank">Master list comprehension.</a></li> </ul> <p>Here’s the code for this one using the wildcard operator in a pattern to count all occurrences of this pattern in the list.</p> <pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">>>> import re >>> lst = ['Susi', 'Ann', 'Susanne', 'Susy'] >>> pattern = 'Sus.*' >>> frequency = sum(1 if re.match(pattern, x) else 0 for x in lst) >>> print(frequency) 3</pre> <p>The generator expression produces a bunch of 1s and 0s—the former if the list element starts with prefix <code>'Sus'</code> and the latter if it doesn’t. By summing over all elements, you get the number of matches of the wildcard operator.</p> <h2>Where to Go From Here?</h2> <p>You’ve learned how you can get the number of elements that match a certain condition. It can be a Boolean condition or even a regular expression—the framework stays the same. </p> <p>Do you want to accelerate your learning efficiency? Do you want to work from the comfort of your own home? Do you want to make a comfortable living by coding 3-5 hours for clients online? </p> <p>Then join my <a href="https://blog.finxter.com/become-python-freelancer-course/" target="_blank" rel="noreferrer noopener">Python freelancer program</a> and take your first steps towards six figures and attainment of your practical code projects in no time!</p> <p>Are you still unsure? Watch the<a rel="noreferrer noopener" href="https://blog.finxter.com/webinar-freelancer/" target="_blank"> free software dev online webinar first</a>. It’s fun and you don’t have to have any preknowledge! <img src="https://s.w.org/images/core/emoji/12.0.0-1/72x72/1f60a.png" alt="?" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p> </div> https://www.sickgaming.net/blog/2020/03/29/python-how-to-count-elements-in-a-list-matching-a-condition/ |