-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathSets-in-SymPy-and-built-in-Python-sets.html
More file actions
275 lines (263 loc) · 28.8 KB
/
Sets-in-SymPy-and-built-in-Python-sets.html
File metadata and controls
275 lines (263 loc) · 28.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="generator" content="Pelican" />
<title>Set operations with Python set compared to SymPy's FiniteSet</title>
<link rel="stylesheet" href="./theme/css/main.css" />
<link href="http://doingmathwithpython.github.io/feeds/all.atom.xml" type="application/atom+xml" rel="alternate" title="Doing Math with Python Atom Feed" />
<meta name="description" content="Sets in SymPy and built-in Python sets" />
</head>
<body id="index" class="home">
<header id="banner" class="body">
<h1><a href="./">Doing Math with Python</a></h1>
<nav><ul>
<li><a href="./pages/about.html">About</a></li>
<li><a href="./pages/software-installation.html">Software Installation</a></li>
<li><a href="./pages/programs.html">Programs</a></li>
<li><a href="./pages/errata.html">Errata</a></li>
<li><a href="./pages/help.html">Help</a></li>
<li><a href="./pages/buy.html">Buy</a></li>
<li><a href="./pages/reviews.html">Reviews</a></li>
</ul></nav>
</header><!-- /#banner -->
<section id="content" class="body">
<article>
<header>
<h1 class="entry-title">
<a href="./Sets-in-SymPy-and-built-in-Python-sets.html" rel="bookmark"
title="Permalink to Set operations with Python set compared to SymPy's FiniteSet">Set operations with Python <tt class="docutils literal">set</tt> compared to SymPy's FiniteSet</a></h1>
</header>
<div class="entry-content">
<footer class="post-info">
<abbr class="published" title="2015-09-05T23:00:00+10:00">
Published: Sat 05 September 2015
</abbr>
<address class="vcard author">
By <a class="url fn" href="./author/amit-saha.html">Amit Saha</a>
</address>
<p>In <a href="./category/articles.html">articles</a>.</p>
</footer><!-- /.post-info --> <p><cite>Chapter 5</cite> (<a class="reference external" href="./pages/about.html">About</a>) of the book discusses working with mathematical sets in
Python. While writing the chapter, I had a choice of whether to
use Python 3's built-in <a class="reference external" href="https://docs.python.org/3.3/library/stdtypes.html?highlight=union#set-types-set-frozenset">set</a> data
structure or use SymPy's (0.7.6 +) <tt class="docutils literal">FiniteSet</tt> class. I decided to go ahead
with the latter. My choice is briefly explained towards the end of
this post, but hopefully it will be clear before that.</p>
<p>Next, I describe how you can use Python 3's built-in set data
structure to create sets and perform set operations such as finding
the union, intersection or cartesian product of sets. For comparison,
I also show how you can do the same using SymPy's <tt class="docutils literal">FiniteSet</tt> class.</p>
<div class="section" id="creating-a-set">
<h2>Creating a set</h2>
<p>We can create a set consisting of the elements <cite>{1, 2, 3}</cite> in Python 3
as follows:</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">s1</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="o">>>></span> <span class="n">s1</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>
</pre></div>
<p>To create a set when the elements are already in a list (for
example), we would use the following syntax:</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">items</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="o">>>></span> <span class="n">s2</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">items</span><span class="p">)</span>
<span class="o">>>></span> <span class="n">s2</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>
</pre></div>
<p>The comparative operations using SymPy's <tt class="docutils literal">FiniteSet</tt> class are:</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="kn">from</span> <span class="nn">sympy</span> <span class="kn">import</span> <span class="n">FiniteSet</span>
<span class="o">>>></span> <span class="n">s1</span> <span class="o">=</span> <span class="n">FiniteSet</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="o">>>></span> <span class="n">s1</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="o">>>></span> <span class="n">items</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="o">>>></span> <span class="n">s2</span> <span class="o">=</span> <span class="n">FiniteSet</span><span class="p">(</span><span class="o">*</span><span class="n">items</span><span class="p">)</span>
<span class="o">>>></span> <span class="n">s2</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>
</pre></div>
<p>To create an <a class="reference external" href="https://en.wikipedia.org/wiki/Empty_set">empty set</a>,
in Python 3 you would use create an empty <tt class="docutils literal">set</tt> object:</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">e</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
<span class="o">>>></span> <span class="n">e</span>
<span class="nb">set</span><span class="p">()</span>
</pre></div>
<p>In SymPy, an empty set is represented by an <tt class="docutils literal">EmptySet</tt> object. Thus,
you can either create an empty set by directly creating an
<tt class="docutils literal">EmptySet</tt> object or by creating a <tt class="docutils literal">FiniteSet</tt> object without
specifying any set members, like so:</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="kn">from</span> <span class="nn">sympy</span> <span class="kn">import</span> <span class="n">EmptySet</span>
<span class="o">>>></span> <span class="n">e</span> <span class="o">=</span> <span class="n">EmptySet</span><span class="p">()</span>
<span class="o">>>></span> <span class="n">e</span>
<span class="n">EmptySet</span><span class="p">()</span>
<span class="o">>>></span> <span class="n">e</span> <span class="o">=</span> <span class="n">FiniteSet</span><span class="p">()</span>
<span class="o">>>></span> <span class="n">e</span>
<span class="n">EmptySet</span><span class="p">()</span>
</pre></div>
</div>
<div class="section" id="cardinality-and-membership">
<h2>Cardinality and Membership</h2>
<p>The <tt class="docutils literal">len()</tt> function returns the number of set members for sets
created using either of the above approaches.</p>
<p>Similarly, to check if an item <tt class="docutils literal">x</tt> is present in a set, <tt class="docutils literal">s</tt>
created using any of the above approaches, we can use the statement,
<tt class="docutils literal">x in s</tt>.</p>
</div>
<div class="section" id="union-and-intersection">
<h2>Union and intersection</h2>
<p>The <tt class="docutils literal">union()</tt> method can be used in both cases to find the union of
two or more sets:</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">s1</span> <span class="o">=</span> <span class="nb">set</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="o">>>></span> <span class="n">s2</span> <span class="o">=</span> <span class="nb">set</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">4</span><span class="p">])</span>
<span class="o">>>></span> <span class="n">s3</span> <span class="o">=</span> <span class="nb">set</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">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">])</span>
<span class="o">>>></span> <span class="n">s1</span><span class="o">.</span><span class="n">union</span><span class="p">(</span><span class="n">s2</span><span class="p">)</span><span class="o">.</span><span class="n">union</span><span class="p">(</span><span class="n">s3</span><span class="p">)</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">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">}</span>
</pre></div>
<p>Similary in the case of SymPy:</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="kn">from</span> <span class="nn">sympy</span> <span class="kn">import</span> <span class="n">FiniteSet</span>
<span class="o">>>></span> <span class="n">s1</span> <span class="o">=</span> <span class="n">FiniteSet</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="o">>>></span> <span class="n">s2</span> <span class="o">=</span> <span class="n">FiniteSet</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">4</span><span class="p">)</span>
<span class="o">>>></span> <span class="n">s3</span> <span class="o">=</span> <span class="n">FiniteSet</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">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
<span class="o">>>></span> <span class="n">s1</span><span class="o">.</span><span class="n">union</span><span class="p">(</span><span class="n">s2</span><span class="p">)</span><span class="o">.</span><span class="n">union</span><span class="p">(</span><span class="n">s3</span><span class="p">)</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">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">}</span>
</pre></div>
<p>The <tt class="docutils literal">intersection()</tt> method can be used to find the intersection of
two or more sets created using either of the above approaches. Continuing
with the above three sets:</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">s1</span> <span class="o">=</span> <span class="nb">set</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="o">>>></span> <span class="n">s2</span> <span class="o">=</span> <span class="nb">set</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">4</span><span class="p">])</span>
<span class="o">>>></span> <span class="n">s3</span> <span class="o">=</span> <span class="nb">set</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">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">])</span>
<span class="o">>>></span> <span class="n">s1</span><span class="o">.</span><span class="n">intersection</span><span class="p">(</span><span class="n">s2</span><span class="p">)</span><span class="o">.</span><span class="n">intersection</span><span class="p">(</span><span class="n">s3</span><span class="p">)</span>
<span class="p">{</span><span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">}</span>
</pre></div>
<p>Similary, in SymPy:</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">s1</span><span class="o">.</span><span class="n">intersection</span><span class="p">(</span><span class="n">s2</span><span class="p">)</span><span class="o">.</span><span class="n">intersection</span><span class="p">(</span><span class="n">s3</span><span class="p">)</span>
<span class="p">{</span><span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">}</span>
</pre></div>
</div>
<div class="section" id="cartesian-product">
<h2>Cartesian product</h2>
<p>To find the cartesian product of sets created via the built-in <tt class="docutils literal">set</tt>
data structure, we have to use the <tt class="docutils literal">product()</tt> function in the
<a class="reference external" href="https://docs.python.org/3/library/itertools.html#itertools.product">itertools</a>
module:</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">s1</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="o">>>></span> <span class="n">s2</span> <span class="o">=</span> <span class="p">{</span><span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">}</span>
<span class="o">>>></span> <span class="kn">import</span> <span class="nn">itertools</span>
<span class="o">>>></span> <span class="n">itertools</span><span class="o">.</span><span class="n">product</span><span class="p">(</span><span class="n">s1</span><span class="p">,</span> <span class="n">s2</span><span class="p">)</span>
<span class="o"><</span><span class="n">itertools</span><span class="o">.</span><span class="n">product</span> <span class="nb">object</span> <span class="n">at</span> <span class="mh">0x10418c990</span><span class="o">></span>
</pre></div>
<p>However considering that the <cite>cartesian product</cite> of two sets <a class="reference external" href="http://mathinsight.org/definition/cartesian_product">should</a> be another set,
the <tt class="docutils literal">product()</tt> function doesn't really then return the
cartesian product itself, but (an iterator to) the elements in it. Hence, if we
try to apply the result returned by the function directly to a method or
function which is expected to be applicable to a set, it will fail. For
example, <tt class="docutils literal">itertools.product(s1, <span class="pre">s2).union(s3)</span></tt> will result in an error, but
<tt class="docutils literal">set(itertools.product(s1, <span class="pre">s2)).union(s3)</span></tt> will work.</p>
<p>Using SymPy's <tt class="docutils literal">FiniteSet</tt>, you can use the <tt class="docutils literal">*</tt>
(multiplication or product) operator to find the cartesian product
and the result is a set itself. Thus, it is closer to what
a cartesian product is mathematically. An example follows:</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">s1</span> <span class="o">=</span> <span class="n">FiniteSet</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="o">>>></span> <span class="n">s2</span> <span class="o">=</span> <span class="n">FiniteSet</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span>
<span class="o">>>></span> <span class="o">>>></span> <span class="n">s3</span> <span class="o">=</span> <span class="n">FiniteSet</span><span class="p">(</span><span class="mi">7</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">9</span><span class="p">)</span>
<span class="o">>>></span> <span class="p">(</span><span class="n">s1</span><span class="o">*</span><span class="n">s2</span><span class="p">)</span><span class="o">.</span><span class="n">union</span><span class="p">(</span><span class="n">s3</span><span class="p">)</span>
<span class="p">{</span><span class="mi">7</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">9</span><span class="p">}</span> <span class="n">U</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="n">x</span> <span class="p">{</span><span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">}</span>
</pre></div>
<p><strong>Cartesian product of a set with itself</strong></p>
<p>To find the cartesian product of a set with itself, i.e. <cite>s1*s1</cite> for
example, we pass in a keyword argument, <tt class="docutils literal">repeat</tt> while calling the
<tt class="docutils literal">itertools.product()</tt> function. The value of <tt class="docutils literal">repeat</tt> is the
<cite>power</cite> we want to raise the set to. Thus, <tt class="docutils literal">itertools.product(s1,
repeat=2)</tt> will calculate the cartesian product, <cite>s1*s1</cite>:</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">s1</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="o">>>></span> <span class="nb">set</span><span class="p">(</span><span class="n">itertools</span><span class="o">.</span><span class="n">product</span><span class="p">(</span><span class="n">s1</span><span class="p">,</span> <span class="n">repeat</span><span class="o">=</span><span class="mi">2</span><span class="p">))</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="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">2</span><span class="p">),</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</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="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">2</span><span class="p">),</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)}</span>
</pre></div>
<p>In SymPy, the <tt class="docutils literal">**</tt> operator can be used for finding the cartesian
product of a set with itself:</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">s1</span> <span class="o">=</span> <span class="n">FiniteSet</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="o">>>></span> <span class="n">s1</span><span class="o">**</span><span class="mi">2</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="n">x</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>
</pre></div>
</div>
<div class="section" id="subset-super-set-proper-subset-checking">
<h2>Subset/super set/proper subset checking</h2>
<p>The <tt class="docutils literal">issubset()</tt> and <tt class="docutils literal">issuperset()</tt> methods are available for sets
created via either approaches to check if a set is a subset and super
set of another, respectively. Thus, <tt class="docutils literal">s1.issubset(s2)</tt> will check if
<cite>s1</cite> is a subset of <cite>s2</cite>.</p>
<p><strong>Checking for proper subset and superset</strong></p>
<p>To check if a set, <cite>s1</cite> is a <a class="reference external" href="http://mathworld.wolfram.com/ProperSubset.html">proper subset</a> of another set,
<cite>s2</cite> when using built-in set, we can do the following:</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">s1</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="o">>>></span> <span class="n">s2</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">4</span><span class="p">}</span>
<span class="o">>>></span> <span class="n">s1</span><span class="o">.</span><span class="n">issubset</span><span class="p">(</span><span class="n">s2</span><span class="p">)</span> <span class="ow">and</span> <span class="n">s1</span> <span class="o">!=</span> <span class="n">s2</span>
<span class="kc">True</span>
</pre></div>
<p>We can do something similar for <a class="reference external" href="http://mathinsight.org/definition/proper_superset">proper superset</a>.</p>
<p>In SymPy, we have <tt class="docutils literal">is_proper_subset()</tt> and <tt class="docutils literal">is_proper_superset()</tt>
methods which can be used to check if a set is a proper subset or
superset of another, respectively. Thus, the above would be written as
<tt class="docutils literal">s1.is_proper_subset(s2)</tt>.</p>
</div>
<div class="section" id="calculating-the-powerset">
<h2>Calculating the powerset</h2>
<p>For sets created via built-in <tt class="docutils literal">set</tt> data structure, there is no
direct method available to create the <a class="reference external" href="https://www.mathsisfun.com/sets/power-set.html">power set</a>. However, you can use the
<tt class="docutils literal">powerset</tt> recipe described in the <a class="reference external" href="https://docs.python.org/3/library/itertools.html#recipes">itertools documentation</a>.</p>
<p>On the other hand, in SymPy, there is a <tt class="docutils literal">powerset()</tt> method
available which returns the power set:</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">s1</span> <span class="o">=</span> <span class="n">FiniteSet</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="o">>>></span> <span class="n">s1</span><span class="o">.</span><span class="n">powerset</span><span class="p">()</span>
<span class="p">{</span><span class="n">EmptySet</span><span class="p">(),</span> <span class="p">{</span><span class="mi">1</span><span class="p">},</span> <span class="p">{</span><span class="mi">2</span><span class="p">},</span> <span class="p">{</span><span class="mi">3</span><span class="p">},</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="p">{</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">},</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="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>
</pre></div>
<p>You can see that the <tt class="docutils literal">powerset()</tt> method returns the power <cite>set</cite> and not the
elements in it.</p>
</div>
<div class="section" id="choice-of-sympy-s-finiteset-over-set">
<h2>Choice of SymPy's <tt class="docutils literal">FiniteSet</tt> over <tt class="docutils literal">set</tt></h2>
<p>From the above comparison, we can see that SymPy's <tt class="docutils literal">FiniteSet</tt>
provides us with nice features such as being able to use the <tt class="docutils literal">*</tt>
operator to find the cartesian product, <tt class="docutils literal">**</tt> operator to calculate
the cartesian product with itself and <tt class="docutils literal">powerset()</tt> method for calculating the
power set. These are not present when using the built-in <tt class="docutils literal">set</tt> data
structure. This was certainly a big driving factor in my choice,
since SymPy was also being used in other chapters of the book.</p>
<p>However, a <em>key</em> reason for my choice was that I wanted to show how we
can create sets which did not allow addition or removal once created -
like mathematical sets. This need was fulfilled by SymPy's
<tt class="docutils literal">FiniteSet</tt> since it used Python's <tt class="docutils literal">frozenset</tt> data structure and
not the <tt class="docutils literal">set</tt> data sturcture.</p>
<p>The alternative to that would have
been to use <tt class="docutils literal">frozenset</tt> directly, but I just did not like the idea
of it and I would have also missed out on the nice features
<tt class="docutils literal">FiniteSet</tt> would provide (eventually). I should note here that once
I had made the decision to go with <tt class="docutils literal">FiniteSet</tt>, I <a class="reference external" href="https://github.com/amitsaha/sympy/commits?author=amitsaha">contributed</a> patches
to SymPy to make the methods of <tt class="docutils literal">FiniteSet</tt> more compatible with Python's built in set
and also implement minor features I discussed above.</p>
</div>
</div><!-- /.entry-content -->
</article>
</section>
<section id="extras" class="body">
<div class="social">
<h2>social</h2>
<ul>
<li><a href="http://doingmathwithpython.github.io/feeds/all.atom.xml" type="application/atom+xml" rel="alternate">atom feed</a></li>
</ul>
</div><!-- /.social -->
</section><!-- /#extras -->
<footer id="contentinfo" class="body">
<address id="about" class="vcard body">
Proudly powered by <a href="https://getpelican.com/">Pelican</a>, which takes great advantage of <a href="https://www.python.org/">Python</a>.
</address><!-- /#about -->
<p>The theme is by <a href="https://www.smashingmagazine.com/2009/08/designing-a-html-5-layout-from-scratch/">Smashing Magazine</a>, thanks!</p>
</footer><!-- /#contentinfo -->
<script type="text/javascript">
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-67534179-1', 'auto');
ga('send', 'pageview');
</script>
</body>
</html>