<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0"
     xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
     xmlns:atom="http://www.w3.org/2005/Atom"
     xmlns:dc="http://purl.org/dc/elements/1.1/"
     xmlns:wfw="http://wellformedweb.org/CommentAPI/"
     >
  <channel>
    <atom:link href="http://kitchingroup.cheme.cmu.edu/blog/feed/index.xml" rel="self" type="application/rss+xml" />
    <title>The Kitchin Research Group</title>
    <link>https://kitchingroup.cheme.cmu.edu/blog</link>
    <description>Chemical Engineering at Carnegie Mellon University</description>
    <pubDate>Sat, 01 Nov 2025 13:47:46 GMT</pubDate>
    <generator>Blogofile</generator>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    
    <item>
      <title>The and-or trick in python</title>
      <link>https://kitchingroup.cheme.cmu.edu/blog/2013/07/07/The-and-or-trick-in-python</link>
      <pubDate>Sun, 07 Jul 2013 08:38:39 EDT</pubDate>
      <category><![CDATA[logic]]></category>
      <category><![CDATA[programming]]></category>
      <guid isPermaLink="false">wUPIgWIFYLi93X02dpKTy2ig9BU=</guid>
      <description>The and-or trick in python</description>
      <content:encoded><![CDATA[


&lt;div id="table-of-contents"&gt;
&lt;h2&gt;Table of Contents&lt;/h2&gt;
&lt;div id="text-table-of-contents"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#sec-1"&gt;1. Using more modern python syntax than the and-or trick&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#sec-2"&gt;2. using defaultdict&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;
The boolean logic commands &lt;code&gt;and&lt;/code&gt; and &lt;code&gt;or&lt;/code&gt; have return values in python. Let us first review briefly what these operators do by examples. The typical usage is in conditional statements. First, we look at what kind of values evaluate to "True" or "False" in python. Anything that is "empty" usually evaluates to False, along with the integer 0 and the boolean value of False.
&lt;/p&gt;

&lt;div class="org-src-container"&gt;

&lt;pre class="src src-python"&gt;&lt;span style="color: #8b0000;"&gt;for&lt;/span&gt; value &lt;span style="color: #8b0000;"&gt;in&lt;/span&gt; (&lt;span style="color: #228b22;"&gt;''&lt;/span&gt;, 0, &lt;span style="color: #8b0000;"&gt;None&lt;/span&gt;, [], (), {}, &lt;span style="color: #8b0000;"&gt;False&lt;/span&gt;):
    &lt;span style="color: #8b0000;"&gt;if&lt;/span&gt; value:
        &lt;span style="color: #8b0000;"&gt;print&lt;/span&gt; value, &lt;span style="color: #228b22;"&gt;"True"&lt;/span&gt;
    &lt;span style="color: #8b0000;"&gt;else:&lt;/span&gt;
        &lt;span style="color: #8b0000;"&gt;print&lt;/span&gt; value, &lt;span style="color: #228b22;"&gt;"False"&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;

&lt;pre class="example"&gt;
 False
0 False
None False
[] False
() False
{} False
False False
&lt;/pre&gt;

&lt;p&gt;
Objects that are not empty evaluate to "True", along with numbers not equal to 0, and the boolean value True.
&lt;/p&gt;

&lt;div class="org-src-container"&gt;

&lt;pre class="src src-python"&gt;&lt;span style="color: #8b0000;"&gt;for&lt;/span&gt; value &lt;span style="color: #8b0000;"&gt;in&lt;/span&gt; (&lt;span style="color: #228b22;"&gt;' '&lt;/span&gt;, 2, 1, &lt;span style="color: #228b22;"&gt;"a"&lt;/span&gt;, [1], (3,), &lt;span style="color: #8b0000;"&gt;True&lt;/span&gt;):
    &lt;span style="color: #8b0000;"&gt;if&lt;/span&gt; value:
        &lt;span style="color: #8b0000;"&gt;print&lt;/span&gt; value, &lt;span style="color: #228b22;"&gt;"True"&lt;/span&gt;
    &lt;span style="color: #8b0000;"&gt;else:&lt;/span&gt;
        &lt;span style="color: #8b0000;"&gt;print&lt;/span&gt; value, &lt;span style="color: #228b22;"&gt;"False"&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;

&lt;pre class="example"&gt;
  True
2 True
1 True
a True
[1] True
(3,) True
True True
&lt;/pre&gt;

&lt;p&gt;
The &lt;code&gt;and&lt;/code&gt; and &lt;code&gt;or&lt;/code&gt; operators compare two objects. &lt;code&gt;and&lt;/code&gt; evaluates to "True" if both objects evaluate to "True" and &lt;code&gt;or&lt;/code&gt; evaluates to "True" if either object evaluates to "True". Here are some examples.
&lt;/p&gt;

&lt;div class="org-src-container"&gt;

&lt;pre class="src src-python"&gt;a = &lt;span style="color: #8b0000;"&gt;None&lt;/span&gt;
b = 5

&lt;span style="color: #8b0000;"&gt;if&lt;/span&gt; a &lt;span style="color: #8b0000;"&gt;and&lt;/span&gt; b:
    &lt;span style="color: #8b0000;"&gt;print&lt;/span&gt; &lt;span style="color: #8b0000;"&gt;True&lt;/span&gt;
&lt;span style="color: #8b0000;"&gt;else:&lt;/span&gt;
    &lt;span style="color: #8b0000;"&gt;print&lt;/span&gt; &lt;span style="color: #8b0000;"&gt;False&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;

&lt;pre class="example"&gt;
False
&lt;/pre&gt;

&lt;div class="org-src-container"&gt;

&lt;pre class="src src-python"&gt;a = &lt;span style="color: #8b0000;"&gt;None&lt;/span&gt;
b = 5

&lt;span style="color: #8b0000;"&gt;if&lt;/span&gt; a &lt;span style="color: #8b0000;"&gt;or&lt;/span&gt; b:
    &lt;span style="color: #8b0000;"&gt;print&lt;/span&gt; &lt;span style="color: #8b0000;"&gt;True&lt;/span&gt;
&lt;span style="color: #8b0000;"&gt;else:&lt;/span&gt;
    &lt;span style="color: #8b0000;"&gt;print&lt;/span&gt; &lt;span style="color: #8b0000;"&gt;False&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;

&lt;pre class="example"&gt;
True
&lt;/pre&gt;

&lt;p&gt;
Now the interesting part. The &lt;code&gt;and&lt;/code&gt; and &lt;code&gt;or&lt;/code&gt; operators actually return values! With the &lt;code&gt;and&lt;/code&gt; operator, each argument is evaluated, and if they all evaluate to True, the last argument is returned. Otherwise the first False argument is returned.
&lt;/p&gt;

&lt;div class="org-src-container"&gt;

&lt;pre class="src src-python"&gt;a = 1
b = 5
&lt;span style="color: #8b0000;"&gt;print&lt;/span&gt; a &lt;span style="color: #8b0000;"&gt;and&lt;/span&gt; b
&lt;span style="color: #8b0000;"&gt;print&lt;/span&gt; b &lt;span style="color: #8b0000;"&gt;and&lt;/span&gt; a
&lt;span style="color: #8b0000;"&gt;print&lt;/span&gt; a &lt;span style="color: #8b0000;"&gt;and&lt;/span&gt; &lt;span style="color: #8b0000;"&gt;False&lt;/span&gt;
&lt;span style="color: #8b0000;"&gt;print&lt;/span&gt; a &lt;span style="color: #8b0000;"&gt;and&lt;/span&gt; &lt;span style="color: #8b0000;"&gt;True&lt;/span&gt;
&lt;span style="color: #8b0000;"&gt;print&lt;/span&gt; a &lt;span style="color: #8b0000;"&gt;and&lt;/span&gt; &lt;span style="color: #8b0000;"&gt;None&lt;/span&gt;
&lt;span style="color: #8b0000;"&gt;print&lt;/span&gt; &lt;span style="color: #8b0000;"&gt;False&lt;/span&gt; &lt;span style="color: #8b0000;"&gt;and&lt;/span&gt; a
&lt;span style="color: #8b0000;"&gt;print&lt;/span&gt; &lt;span style="color: #8b0000;"&gt;None&lt;/span&gt; &lt;span style="color: #8b0000;"&gt;and&lt;/span&gt; a
&lt;span style="color: #8b0000;"&gt;print&lt;/span&gt; &lt;span style="color: #8b0000;"&gt;True&lt;/span&gt; &lt;span style="color: #8b0000;"&gt;and&lt;/span&gt; &lt;span style="color: #228b22;"&gt;'a'&lt;/span&gt; &lt;span style="color: #8b0000;"&gt;and&lt;/span&gt; 0 &lt;span style="color: #8b0000;"&gt;and&lt;/span&gt; &lt;span style="color: #8b0000;"&gt;True&lt;/span&gt; &lt;span style="color: #ff0000; font-weight: bold;"&gt;# &lt;/span&gt;&lt;span style="color: #ff0000; font-weight: bold;"&gt;first False item is zero&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;

&lt;pre class="example"&gt;
5
1
False
True
None
False
None
0
&lt;/pre&gt;

&lt;p&gt;
The &lt;code&gt;or&lt;/code&gt; operator returns the first True value or the last value if nothing is True. Note that if a True value is found, the values in the expressions after that value are not evaluated.
&lt;/p&gt;

&lt;div class="org-src-container"&gt;

&lt;pre class="src src-python"&gt;&lt;span style="color: #8b0000;"&gt;print&lt;/span&gt; 2 &lt;span style="color: #8b0000;"&gt;or&lt;/span&gt; &lt;span style="color: #8b0000;"&gt;False&lt;/span&gt;
&lt;span style="color: #8b0000;"&gt;print&lt;/span&gt; 0 &lt;span style="color: #8b0000;"&gt;or&lt;/span&gt; &lt;span style="color: #8b0000;"&gt;False&lt;/span&gt;
&lt;span style="color: #8b0000;"&gt;print&lt;/span&gt; 0 &lt;span style="color: #8b0000;"&gt;or&lt;/span&gt; &lt;span style="color: #8b0000;"&gt;False&lt;/span&gt; &lt;span style="color: #8b0000;"&gt;or&lt;/span&gt; 4 &lt;span style="color: #8b0000;"&gt;or&lt;/span&gt; {}
&lt;/pre&gt;
&lt;/div&gt;

&lt;pre class="example"&gt;
2
False
4
&lt;/pre&gt;

&lt;p&gt;
One way you might see this is to set variables depending on what command-line arguments were used in a script. For example:
&lt;/p&gt;

&lt;div class="org-src-container"&gt;

&lt;pre class="src src-python"&gt;&lt;span style="color: #8b0000;"&gt;import&lt;/span&gt; sys

&lt;span style="color: #ff0000; font-weight: bold;"&gt;# &lt;/span&gt;&lt;span style="color: #ff0000; font-weight: bold;"&gt;replace this:&lt;/span&gt;
&lt;span style="color: #8b0000;"&gt;if&lt;/span&gt; &lt;span style="color: #228b22;"&gt;'plot'&lt;/span&gt; &lt;span style="color: #8b0000;"&gt;in&lt;/span&gt; sys.argv:
    PLOT = &lt;span style="color: #8b0000;"&gt;True&lt;/span&gt;
&lt;span style="color: #8b0000;"&gt;else:&lt;/span&gt;
    PLOT = &lt;span style="color: #8b0000;"&gt;False&lt;/span&gt;

&lt;span style="color: #ff0000; font-weight: bold;"&gt;# &lt;/span&gt;&lt;span style="color: #ff0000; font-weight: bold;"&gt;with this&lt;/span&gt;
PLOT = &lt;span style="color: #228b22;"&gt;'plot'&lt;/span&gt; &lt;span style="color: #8b0000;"&gt;in&lt;/span&gt; sys.argv &lt;span style="color: #8b0000;"&gt;or&lt;/span&gt; &lt;span style="color: #8b0000;"&gt;False&lt;/span&gt;

&lt;span style="color: #ff0000; font-weight: bold;"&gt;# &lt;/span&gt;&lt;span style="color: #ff0000; font-weight: bold;"&gt;later in your code:&lt;/span&gt;
&lt;span style="color: #8b0000;"&gt;if&lt;/span&gt; PLOT: 
    &lt;span style="color: #ff0000; font-weight: bold;"&gt;# &lt;/span&gt;&lt;span style="color: #ff0000; font-weight: bold;"&gt;do something to make a plot&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
Now we get to the &lt;a href="http://www.diveintopython.net/power_of_introspection/and_or.html"&gt;and-or&lt;/a&gt; trick. The trick is to assign a variable one value if some boolean value is True, and another value if the expression is False. 
&lt;/p&gt;

&lt;div class="org-src-container"&gt;

&lt;pre class="src src-python"&gt;a = &lt;span style="color: #8b0000;"&gt;True&lt;/span&gt;
b = &lt;span style="color: #8b0000;"&gt;True&lt;/span&gt;

&lt;span style="color: #8b0000;"&gt;if&lt;/span&gt; a &lt;span style="color: #8b0000;"&gt;and&lt;/span&gt; b:
    c = &lt;span style="color: #228b22;"&gt;"value1"&lt;/span&gt;
&lt;span style="color: #8b0000;"&gt;else:&lt;/span&gt; 
    c = &lt;span style="color: #228b22;"&gt;"value2"&lt;/span&gt;

&lt;span style="color: #8b0000;"&gt;print&lt;/span&gt; c
&lt;/pre&gt;
&lt;/div&gt;

&lt;pre class="example"&gt;
value1
&lt;/pre&gt;

&lt;p&gt;
We can replace the if/else code above with this one line expression:
&lt;/p&gt;
&lt;div class="org-src-container"&gt;

&lt;pre class="src src-python"&gt;a = &lt;span style="color: #8b0000;"&gt;True&lt;/span&gt;
b = &lt;span style="color: #8b0000;"&gt;True&lt;/span&gt;

c = (a &lt;span style="color: #8b0000;"&gt;and&lt;/span&gt; b) &lt;span style="color: #8b0000;"&gt;and&lt;/span&gt; &lt;span style="color: #228b22;"&gt;"value1"&lt;/span&gt; &lt;span style="color: #8b0000;"&gt;or&lt;/span&gt; &lt;span style="color: #228b22;"&gt;"value2"&lt;/span&gt;
&lt;span style="color: #8b0000;"&gt;print&lt;/span&gt; c
&lt;/pre&gt;
&lt;/div&gt;

&lt;pre class="example"&gt;
value1
&lt;/pre&gt;

&lt;p&gt;
There is a problem. If the first value evaluates to False, you will not get what you expect:
&lt;/p&gt;

&lt;div class="org-src-container"&gt;

&lt;pre class="src src-python"&gt;a = &lt;span style="color: #8b0000;"&gt;True&lt;/span&gt;
b = &lt;span style="color: #8b0000;"&gt;True&lt;/span&gt;

c = (a &lt;span style="color: #8b0000;"&gt;and&lt;/span&gt; b) &lt;span style="color: #8b0000;"&gt;and&lt;/span&gt; &lt;span style="color: #8b0000;"&gt;None&lt;/span&gt; &lt;span style="color: #8b0000;"&gt;or&lt;/span&gt; &lt;span style="color: #228b22;"&gt;"value2"&lt;/span&gt;
&lt;span style="color: #8b0000;"&gt;print&lt;/span&gt; c
&lt;/pre&gt;
&lt;/div&gt;

&lt;pre class="example"&gt;
value2
&lt;/pre&gt;

&lt;p&gt;
In this case, (a &lt;code&gt;and&lt;/code&gt; b) evaluates to True, so we would expect the value of c to be the first value. However, None evaluates to False, so the &lt;code&gt;or&lt;/code&gt; operator returns the first "True" value, which is the second value. We have to modify the code so that both the or arguments are True. We do this by putting both arguments inside a list, which will then always evaluate to True. This will assign the first list to c if the expression is True, and the second list if it is False. We wrap the whole thing in parentheses, and then index the returned list to get the contents of the list.
&lt;/p&gt;

&lt;div class="org-src-container"&gt;

&lt;pre class="src src-python"&gt;a = &lt;span style="color: #8b0000;"&gt;True&lt;/span&gt;
b = &lt;span style="color: #8b0000;"&gt;True&lt;/span&gt;

c = ((a &lt;span style="color: #8b0000;"&gt;and&lt;/span&gt; b) &lt;span style="color: #8b0000;"&gt;and&lt;/span&gt; [&lt;span style="color: #8b0000;"&gt;None&lt;/span&gt;] &lt;span style="color: #8b0000;"&gt;or&lt;/span&gt; [&lt;span style="color: #228b22;"&gt;"value2"&lt;/span&gt;])[0]

&lt;span style="color: #8b0000;"&gt;print&lt;/span&gt; c
&lt;/pre&gt;
&lt;/div&gt;

&lt;pre class="example"&gt;
None
&lt;/pre&gt;

&lt;div class="org-src-container"&gt;

&lt;pre class="src src-python"&gt;a = &lt;span style="color: #8b0000;"&gt;True&lt;/span&gt;
b = &lt;span style="color: #8b0000;"&gt;True&lt;/span&gt;

c = (&lt;span style="color: #8b0000;"&gt;not&lt;/span&gt; (a &lt;span style="color: #8b0000;"&gt;and&lt;/span&gt; b) &lt;span style="color: #8b0000;"&gt;and&lt;/span&gt; [&lt;span style="color: #8b0000;"&gt;None&lt;/span&gt;] &lt;span style="color: #8b0000;"&gt;or&lt;/span&gt; [&lt;span style="color: #228b22;"&gt;"value2"&lt;/span&gt;])[0]

&lt;span style="color: #8b0000;"&gt;print&lt;/span&gt; c
&lt;/pre&gt;
&lt;/div&gt;

&lt;pre class="example"&gt;
value2
&lt;/pre&gt;

&lt;p&gt;
This is definitely a trick. I find the syntax difficult to read, especially compared to the more verbose if/else statements. It is interesting though, and there might be places where the return value of the boolean operators might be useful, now that you know you can get them.
&lt;/p&gt;

&lt;p&gt;
Here is a tough example of using this to update a dictionary entry. Previously we used a dictionary to &lt;a href="http://jkitchin.github.io/blog/2013/05/29/Getting-a-dictionary-of-counts/"&gt;count&lt;/a&gt; unique entries in a list. 
&lt;/p&gt;
&lt;div class="org-src-container"&gt;

&lt;pre class="src src-python"&gt;d = {}

d[&lt;span style="color: #228b22;"&gt;'key'&lt;/span&gt;] = (d.get(&lt;span style="color: #228b22;"&gt;'key'&lt;/span&gt;, &lt;span style="color: #8b0000;"&gt;None&lt;/span&gt;) &lt;span style="color: #8b0000;"&gt;and&lt;/span&gt; [d[&lt;span style="color: #228b22;"&gt;'key'&lt;/span&gt;] + 1] &lt;span style="color: #8b0000;"&gt;or&lt;/span&gt; [1])[0]

&lt;span style="color: #8b0000;"&gt;print&lt;/span&gt; d

d[&lt;span style="color: #228b22;"&gt;'key'&lt;/span&gt;] = (d.get(&lt;span style="color: #228b22;"&gt;'key'&lt;/span&gt;, &lt;span style="color: #8b0000;"&gt;None&lt;/span&gt;) &lt;span style="color: #8b0000;"&gt;and&lt;/span&gt; [d[&lt;span style="color: #228b22;"&gt;'key'&lt;/span&gt;] + 1] &lt;span style="color: #8b0000;"&gt;or&lt;/span&gt; [1])[0]
&lt;span style="color: #8b0000;"&gt;print&lt;/span&gt; d
&lt;/pre&gt;
&lt;/div&gt;

&lt;pre class="example"&gt;
{'key': 1}
{'key': 2}
&lt;/pre&gt;

&lt;p&gt;
This works because the .get function on a dictionary returns None if the key does not exist, resulting in assigning the value of 1 to that key, or it returns something that evaluates to True if the key does exist, so the key gets incremented. 
&lt;/p&gt;

&lt;p&gt;
Let us see this trick in action. Before we used if/else statements to achieve our goal, checking if the key is in the dictionary and incrementing by one if it is, and if not, setting the key to 1.
&lt;/p&gt;

&lt;div class="org-src-container"&gt;

&lt;pre class="src src-python"&gt;L = [&lt;span style="color: #228b22;"&gt;'a'&lt;/span&gt;, &lt;span style="color: #228b22;"&gt;'a'&lt;/span&gt;, &lt;span style="color: #228b22;"&gt;'b'&lt;/span&gt;,&lt;span style="color: #228b22;"&gt;'d'&lt;/span&gt;, &lt;span style="color: #228b22;"&gt;'e'&lt;/span&gt;, &lt;span style="color: #228b22;"&gt;'b'&lt;/span&gt;, &lt;span style="color: #228b22;"&gt;'e'&lt;/span&gt;, &lt;span style="color: #228b22;"&gt;'a'&lt;/span&gt;]

&lt;span style="color: #ff0000; font-weight: bold;"&gt;# &lt;/span&gt;&lt;span style="color: #ff0000; font-weight: bold;"&gt;old method&lt;/span&gt;
d = {}
&lt;span style="color: #8b0000;"&gt;for&lt;/span&gt; el &lt;span style="color: #8b0000;"&gt;in&lt;/span&gt; L:
    &lt;span style="color: #8b0000;"&gt;if&lt;/span&gt; el &lt;span style="color: #8b0000;"&gt;in&lt;/span&gt; d:
        d[el] += 1
    &lt;span style="color: #8b0000;"&gt;else:&lt;/span&gt;
        d[el] = 1

&lt;span style="color: #8b0000;"&gt;print&lt;/span&gt; d
&lt;/pre&gt;
&lt;/div&gt;

&lt;pre class="example"&gt;
{'a': 3, 'b': 2, 'e': 2, 'd': 1}
&lt;/pre&gt;

&lt;p&gt;
Here is the new method:
&lt;/p&gt;
&lt;div class="org-src-container"&gt;

&lt;pre class="src src-python"&gt;&lt;span style="color: #ff0000; font-weight: bold;"&gt;# &lt;/span&gt;&lt;span style="color: #ff0000; font-weight: bold;"&gt;new method:&lt;/span&gt;
L = [&lt;span style="color: #228b22;"&gt;'a'&lt;/span&gt;, &lt;span style="color: #228b22;"&gt;'a'&lt;/span&gt;, &lt;span style="color: #228b22;"&gt;'b'&lt;/span&gt;,&lt;span style="color: #228b22;"&gt;'d'&lt;/span&gt;, &lt;span style="color: #228b22;"&gt;'e'&lt;/span&gt;, &lt;span style="color: #228b22;"&gt;'b'&lt;/span&gt;, &lt;span style="color: #228b22;"&gt;'e'&lt;/span&gt;, &lt;span style="color: #228b22;"&gt;'a'&lt;/span&gt;]
d = {}
&lt;span style="color: #8b0000;"&gt;for&lt;/span&gt; el &lt;span style="color: #8b0000;"&gt;in&lt;/span&gt; L:
    d[el] = (d.get(el, &lt;span style="color: #8b0000;"&gt;None&lt;/span&gt;) &lt;span style="color: #8b0000;"&gt;and&lt;/span&gt; [d[el] + 1] &lt;span style="color: #8b0000;"&gt;or&lt;/span&gt; [1])[0]
&lt;span style="color: #8b0000;"&gt;print&lt;/span&gt; d
&lt;/pre&gt;
&lt;/div&gt;

&lt;pre class="example"&gt;
{'a': 3, 'b': 2, 'e': 2, 'd': 1}
&lt;/pre&gt;

&lt;p&gt;
We have in (an admittedly hard to read) a single single line replaced the if/else statement! I have for a long time thought this should possible. I am somewhat disappointed that it is not easier to read though.
&lt;/p&gt;


&lt;p&gt;
&lt;b&gt;Update 7/8/2013&lt;/b&gt;
&lt;/p&gt;
&lt;div id="outline-container-sec-1" class="outline-2"&gt;
&lt;h2 id="sec-1"&gt;&lt;span class="section-number-2"&gt;1&lt;/span&gt; Using more modern python syntax than the and-or trick&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-1"&gt;
&lt;p&gt;
@&lt;sub&gt;Mark&lt;/sub&gt;_ pointed out in a comment the &lt;a href="http://docs.python.org/2/reference/expressions.html#conditional-expressions"&gt;more modern syntax&lt;/a&gt; in python is "value1" if a else "value2". Here is how it works.
&lt;/p&gt;

&lt;div class="org-src-container"&gt;

&lt;pre class="src src-python"&gt;a = &lt;span style="color: #8b0000;"&gt;True&lt;/span&gt;
c = &lt;span style="color: #228b22;"&gt;"value1"&lt;/span&gt; &lt;span style="color: #8b0000;"&gt;if&lt;/span&gt; a &lt;span style="color: #8b0000;"&gt;else&lt;/span&gt; &lt;span style="color: #228b22;"&gt;"value2"&lt;/span&gt;
&lt;span style="color: #8b0000;"&gt;print&lt;/span&gt; c
&lt;/pre&gt;
&lt;/div&gt;

&lt;pre class="example"&gt;
value1
&lt;/pre&gt;

&lt;div class="org-src-container"&gt;

&lt;pre class="src src-python"&gt;a = &lt;span style="color: #228b22;"&gt;''&lt;/span&gt;
c = &lt;span style="color: #228b22;"&gt;"value1"&lt;/span&gt; &lt;span style="color: #8b0000;"&gt;if&lt;/span&gt; a &lt;span style="color: #8b0000;"&gt;else&lt;/span&gt; &lt;span style="color: #228b22;"&gt;"value2"&lt;/span&gt;
&lt;span style="color: #8b0000;"&gt;print&lt;/span&gt; c
&lt;/pre&gt;
&lt;/div&gt;

&lt;pre class="example"&gt;
value2
&lt;/pre&gt;

&lt;p&gt;
This is indeed very clean to read. This leads to a cleaner and easier to read implementation of the counting code.
&lt;/p&gt;

&lt;div class="org-src-container"&gt;

&lt;pre class="src src-python"&gt;L = [&lt;span style="color: #228b22;"&gt;'a'&lt;/span&gt;, &lt;span style="color: #228b22;"&gt;'a'&lt;/span&gt;, &lt;span style="color: #228b22;"&gt;'b'&lt;/span&gt;,&lt;span style="color: #228b22;"&gt;'d'&lt;/span&gt;, &lt;span style="color: #228b22;"&gt;'e'&lt;/span&gt;, &lt;span style="color: #228b22;"&gt;'b'&lt;/span&gt;, &lt;span style="color: #228b22;"&gt;'e'&lt;/span&gt;, &lt;span style="color: #228b22;"&gt;'a'&lt;/span&gt;]
d = {}
&lt;span style="color: #8b0000;"&gt;for&lt;/span&gt; el &lt;span style="color: #8b0000;"&gt;in&lt;/span&gt; L:
    d[el] = (d[el] + 1) &lt;span style="color: #8b0000;"&gt;if&lt;/span&gt; (el &lt;span style="color: #8b0000;"&gt;in&lt;/span&gt; d) &lt;span style="color: #8b0000;"&gt;else&lt;/span&gt; 1
&lt;span style="color: #8b0000;"&gt;print&lt;/span&gt; d
&lt;/pre&gt;
&lt;/div&gt;

&lt;pre class="example"&gt;
{'a': 3, 'b': 2, 'e': 2, 'd': 1}
&lt;/pre&gt;

&lt;p&gt;
See the next section for an even cleaner implementation.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-sec-2" class="outline-2"&gt;
&lt;h2 id="sec-2"&gt;&lt;span class="section-number-2"&gt;2&lt;/span&gt; using defaultdict&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-2"&gt;
&lt;p&gt;
@&lt;sub&gt;Mark&lt;/sub&gt;_ also suggested the use of &lt;a href="http://docs.python.org/2/library/collections.html#collections.defaultdict"&gt;defaultdict&lt;/a&gt; for the counting code. That is pretty concise! It is not obvious that the default value is equal to zero, but int() returns zero. This is much better than the and-or trick.
&lt;/p&gt;

&lt;div class="org-src-container"&gt;

&lt;pre class="src src-python"&gt;&lt;span style="color: #8b0000;"&gt;from&lt;/span&gt; collections &lt;span style="color: #8b0000;"&gt;import&lt;/span&gt; defaultdict
&lt;span style="color: #8b0000;"&gt;print&lt;/span&gt; int()

L = [&lt;span style="color: #228b22;"&gt;'a'&lt;/span&gt;, &lt;span style="color: #228b22;"&gt;'a'&lt;/span&gt;, &lt;span style="color: #228b22;"&gt;'b'&lt;/span&gt;,&lt;span style="color: #228b22;"&gt;'d'&lt;/span&gt;, &lt;span style="color: #228b22;"&gt;'e'&lt;/span&gt;, &lt;span style="color: #228b22;"&gt;'b'&lt;/span&gt;, &lt;span style="color: #228b22;"&gt;'e'&lt;/span&gt;, &lt;span style="color: #228b22;"&gt;'a'&lt;/span&gt;]
d = defaultdict(int)
&lt;span style="color: #8b0000;"&gt;for&lt;/span&gt; el &lt;span style="color: #8b0000;"&gt;in&lt;/span&gt; L:
    d[el] += 1
&lt;span style="color: #8b0000;"&gt;print&lt;/span&gt; d
&lt;/pre&gt;
&lt;/div&gt;

&lt;pre class="example"&gt;
0
defaultdict(&amp;lt;type 'int'&amp;gt;, {'a': 3, 'b': 2, 'e': 2, 'd': 1})
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Copyright (C) 2013 by John Kitchin. See the &lt;a href="/copying.html"&gt;License&lt;/a&gt; for information about copying.&lt;p&gt;&lt;p&gt;&lt;a href="/org/2013/07/07/The-and-or-trick-in-python.org"&gt;org-mode source&lt;/a&gt;&lt;p&gt;]]></content:encoded>
    </item>
  </channel>
</rss>
