Create an account


Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[Tut] How to Filter a Dictionary in Python? (… The Most Pythonic Way)

#1
How to Filter a Dictionary in Python? (… The Most Pythonic Way)

<div><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="How to Filter a Dictionary in Python?" width="1400" height="788" src="https://www.youtube.com/embed/n4SOW80qpEs?feature=oembed" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div>
</div>
</figure>
<p><strong>Problem</strong>: Given a dictionary and a filter condition. How to filter a dictionary by …</p>
<ul>
<li>… <strong>key </strong>so that only those <code>(key, value)</code> pairs in the dictionary remain where the <strong>key </strong>satisfies the condition? </li>
<li>… <strong>value </strong>so that only those <code>(key, value)</code> pairs remain where the <strong>value </strong>satisfies the condition?</li>
</ul>
<figure class="wp-block-image size-large is-resized"><img src="https://blog.finxter.com/wp-content/uploads/2020/05/filter-1-1024x576.jpg" alt="" class="wp-image-8825" width="768" height="432" srcset="https://blog.finxter.com/wp-content/uploads/2020/05/filter-1-scaled.jpg 1024w, https://blog.finxter.com/wp-content/uplo...00x169.jpg 300w, https://blog.finxter.com/wp-content/uplo...68x432.jpg 768w" sizes="(max-width: 768px) 100vw, 768px" /></figure>
<p>In this tutorial, you’ll learn four methods and how they compare against each other. It’s loosely based on <a rel="noreferrer noopener" href="https://thispointer.com/python-filter-a-dictionary-by-conditions-on-keys-or-values/" target="_blank">this</a> tutorial but extends it by many additional examples and code explanations.</p>
<p>If you’re too busy to read this tutorial, here’s the spoiler: </p>
<p><strong>Method 4 — Dictionary comprehension <code>{k:v for (k,v) in dict.items() if condition}</code> is the most Pythonic and fastest way to filter a dictionary in Python.</strong></p>
<p>However, by reading this <em>short 8-minute tutorial</em>, you’re going to learn a lot about the <em>nuances of writing Pythonic code</em>. So keep reading!</p>
<h2>Method 1: Simple Iteration to Filter Dictionary</h2>
<p>You should always start with the simplest method to solve a problem (see <a rel="noreferrer noopener" href="https://en.wikipedia.org/wiki/Occam%27s_razor" target="_blank">Occam’s razor</a>) because <a rel="noreferrer noopener" href="https://blog.finxter.com/python-profilers-how-to-speed-up-your-python-app/" target="_blank">premature optimization</a> is the root of all evil!</p>
<p>So let’s have a look at the straightforward loop iteration method to filter a dictionary.</p>
<p>You start with the following dictionary of names:</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="">names = {1: 'Alice', 2: 'Bob', 3: 'Carl', 4: 'Ann', 5: 'Liz'}</pre>
<h3>Filter Python Dictionary By Key (Simple Loop)</h3>
<p>You want to keep those <code>(key, value)</code> pairs where key meets a certain condition (such as <code>key%2 == 1</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="">newDict = dict() # Iterate over all (k,v) pairs in names
for key, value in names.items(): # Is condition satisfied? if key%2 == 1: newDict[key] = value</pre>
<p>Let’s have a look at the output:</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="">print(newDict)
# {1: 'Alice', 3: 'Carl', 5: 'Liz'}</pre>
<p>Only the <code>(key, value)</code> pairs where the <code>key</code> is an odd integer remain in the filtered dictionary <code>newDict</code>. </p>
<p>But what if you want to filter the dictionary by a condition on the values?</p>
<h3>Filter Python Dictionary By Value (Simple Loop)</h3>
<p>To filter by value, you only need to replace one line in the previous code snippet: instead of writing if <code>key%2 == 1: ...</code>, you use the <code>value</code> to determine whether to add a certain <code>(key, value)</code> pair: <code>if len(value)&lt;5: ...</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="">newDict = dict() # Iterate over all (k,v) pairs in names
for key, value in names.items(): # Is condition satisfied? if len(value)&lt;5: newDict[key] = value print(newDict)
# {2: 'Bob', 3: 'Carl', 4: 'Ann', 5: 'Liz'}</pre>
<p>Only the dictionary <code>(key, value)</code> pairs remain in the filtered dictionary <code>newDict</code> where the length of the name string value is less than five characters. </p>
<p><strong>Try It Yourself in Our Interactive Cod Shell (Click “run”):</strong></p>
<p> <iframe src="https://repl.it/@finxter/filterDict1?lite=true" scrolling="no" allowtransparency="true" allowfullscreen="true" sandbox="allow-forms allow-pointer-lock allow-popups allow-same-origin allow-scripts allow-modals" width="100%" height="1100px" frameborder="no"></iframe> </p>
<p>Now, you know the basic method of filtering a dictionary in Python (by key and by value). But can we do better? What if you need to filter many dictionaries by many different filtering conditions? Do we have to rewrite the same code again and again?</p>
<p>The answer is no! Read on to learn about a more generic way to make filtering a dictionary as easy as calling a function passing the dictionary and the filter function. </p>
<h2>Method 2: Generic Function to Filter Dictionary</h2>
<p>How can you use different filtering functions on different dictionaries without writing the same code again and again? The answer is simple: create your own generic filtering function!</p>
<p>Your goal is to create a function <code>filter_dict(dictionary, filter_func)</code> that takes a <code>dictionary</code> to be filtered and a <code>filter_func</code> to determine for each <code>(key, value)</code> pair whether it should be included in the filtered dictionary. </p>
<p>You start with the following dictionary of names:</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="">names = {1: 'Alice', 2: 'Bob', 3: 'Carl', 4: 'Ann', 5: 'Liz'}</pre>
<p>Let’s create the generic filter function!</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 filter_dict(d, f): ''' Filters dictionary d by function f. ''' newDict = dict() # Iterate over all (k,v) pairs in names for key, value in d.items(): # Is condition satisfied? if f(key, value): newDict[key] = value return newDict</pre>
<p>The function takes two arguments: the dictionary <code>d</code> to be filtered and the function <code>f</code> that decides if an element should be included in the new dictionary. </p>
<p>You create an empty dictionary <code>newDict</code> and decide for all elements of the original dictionary d whether they should be included. To accomplish this, you iterate over each original <code>(key, value)</code> pair and pass it to the function <code>f: key, value --> Boolean</code>. The function <code>f</code> returns a Boolean value. If it evaluates to <code>True</code>, the <code>(key, value)</code> pair is added to the new dictionary. Otherwise, it’s skipped. The return value is the newly created dictionary <code>newDict</code>. </p>
<p>Here’s how you can use the filtering function to filter by key:</p>
<h3>Filter Python Dictionary By Key Using Generic Function</h3>
<p>If you want to accomplish the same thing as above—filtering by key to include only odd keys—you simply use the following <a href="https://blog.finxter.com/free-python-one-liners-book-chapter/" target="_blank" rel="noreferrer noopener">one-liner</a> call:</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="">print(filter_dict(names, lambda k,v: k%2 == 1))
# {1: 'Alice', 3: 'Carl', 5: 'Liz'}</pre>
<p>That was easy! The <a href="https://blog.finxter.com/a-simple-introduction-of-the-lambda-function-in-python/" target="_blank" rel="noreferrer noopener">lambda function</a> you pass returns <code>k%2 == 1</code> which is the Boolean filtering value associated to each original element in the dictionary <code>names</code>.</p>
<p>Similarly, if you want to filter by key to include only even key, you’d do the following:</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="">print(filter_dict(names, lambda k,v: k%2 == 0))
# {2: 'Bob', 4: 'Ann'}</pre>
<p>In fact, it’s equally convenient to filter by value using this exact same strategy:</p>
<h3>Filter Python Dictionary By Value Using Generic Function</h3>
<p>Here’s how you use our function <code>filter_dict</code> to filter by value:</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="">print(filter_dict(names, lambda k,v: len(v)&lt;5))
# {2: 'Bob', 3: 'Carl', 4: 'Ann', 5: 'Liz'}</pre>
<p>In the previous code snippet, you filter the dictionary so that only those <code>(key, value)</code> pairs remain where the <code>value</code> has less than five characters.</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="">print(filter_dict(names, lambda k,v: v.startswith('A')))
# {1: 'Alice', 4: 'Ann'}</pre>
<p>In this code snippet, you filter the dictionary so that only those <code>(key, value)</code> pairs remain where the <code>value</code> starts with character <code>'A'</code>.</p>
<p><strong>Try It Yourself in Our Interactive Cod Shell (Click “run”):</strong></p>
<p> <iframe src="https://repl.it/@finxter/filterDict2?lite=true" scrolling="no" allowtransparency="true" allowfullscreen="true" sandbox="allow-forms allow-pointer-lock allow-popups allow-same-origin allow-scripts allow-modals" width="100%" height="1100px" frameborder="no"></iframe> </p>
<p>But is this the most Pythonic way? Hardly so! Read on to learn about a functional approach to accomplish the same thing with less code! </p>
<p><a href="https://www.amazon.com/gp/product/B07ZY7XMX8" target="_blank" rel="noreferrer noopener"><em>(More with less in Python is usually a good thing… Check out my book “Python One-Liners” to master the art of compressing complicated code into a single line.)</em></a></p>
<h2>Method 3: filter() Function on Dictionary</h2>
<p>The <code>filter(function, iterable)</code> function takes a function as input that takes one argument (an element of an iterable) and returns a Boolean value whether this element should pass the filter. All elements that pass the filter are returned as a new <code>iterable</code> object (a filter object).</p>
<p>You can use the <code>lambda</code> function statement to create the function right where you pass it as an argument. The syntax of the lambda function is <code>lambda x: expression</code> and it means that you use <code>x</code> as an input argument and you return expression as a result (that can or cannot use <code>x</code> to decide about the return value). For more information, see my <a rel="noreferrer noopener" href="https://blog.finxter.com/a-simple-introduction-of-the-lambda-function-in-python/" target="_blank">detailed blog article about the lambda function</a>.</p>
<h3>Filter Python Dictionary By Key Using filter() + Lambda Functions</h3>
<p>Here’s how you can filter a dictionary by key using only a single line of code (without defining your custom filter function as in method 2):</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=""># FILTER BY KEY
print(dict(filter(lambda x: x[0]%2 == 1, names.items())))
# {1: 'Alice', 3: 'Carl', 5: 'Liz'}</pre>
<p>You may recognize the same filter lambda function <code>lambda x: x[0]%2 == 1</code> that returns <code>True</code> if the key is an odd integer. Note that this lambda function takes only a single input as this is how the <code>filter()</code> function works (it requires that you pass a function object that takes one argument and maps it to a Boolean value).</p>
<p>You operate on the iterable <code>names.items()</code> that gives you all <code>(key, value)</code> pairs (an element of the iterable is a <code>(key, value)</code> tuple). </p>
<p>After filtering, you convert the filter object back to a dictionary using the <code>dict(...)</code> constructor function.</p>
<p>Another 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="">print(dict(filter(lambda x: x[0]%2 == 0, names.items())))
# {2: 'Bob', 4: 'Ann'}</pre>
<p>Let’s see how this works for filtering by value:</p>
<h3>Filter Python Dictionary By Value Using filter() + Lambda Functions</h3>
<p>You can use the same basic idea—<code>filter()</code> + <code>lambda</code> + <code>dict()</code>—to filter a dictionary by value. For example, if you want to filter out all (key, value) pairs where the value has less than five characters, use the following one-liner:</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="">print(dict(filter(lambda x: len(x[1])&lt;5, names.items())))
# {2: 'Bob', 3: 'Carl', 4: 'Ann', 5: 'Liz'}</pre>
<p>And a second 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="">print(dict(filter(lambda x: x[1].startswith('A'), names.items())))
# {1: 'Alice', 4: 'Ann'}</pre>
<p><strong>Try It Yourself in Our Interactive Cod Shell (Click “run”):</strong></p>
<p> <iframe src="https://repl.it/@finxter/filterDict3?lite=true" scrolling="no" allowtransparency="true" allowfullscreen="true" sandbox="allow-forms allow-pointer-lock allow-popups allow-same-origin allow-scripts allow-modals" width="100%" height="1100px" frameborder="no"></iframe> </p>
<p>So, far so good. But can we do any better? I mean, a single line of code is a single line of code, right? How can we possible improve on that?</p>
<h2>Method 4: Filter By Dictionary Comprehension</h2>
<p>The best way to filter a <a href="https://blog.finxter.com/python-dictionary/" target="_blank" rel="noreferrer noopener">dictionary </a>in Python is to use the powerful method of <a href="https://www.python.org/dev/peps/pep-0274/" target="_blank" rel="noreferrer noopener">dictionary comprehension</a>.</p>
<p>Dictionary comprehension allows you to transform one dictionary into another one—by modifying each <code>(key, value)</code> pair as you like. </p>
<h3>Filter Python Dictionary By Key Using Dictionary Comprehension</h3>
<p>The general framework for dictionary comprehension is <code>{ expression context }</code>.</p>
<ul>
<li><code>expression</code> defines how you would like to change each (key, value) pair. </li>
<li><code>context</code> defines the (key, value) pairs, you’d like to include in the new dictionary.</li>
</ul>
<p>Here’s a practical example that filters all (key, value) pairs with odd keys:</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="">print({k:v for (k,v) in names.items() if k%2 == 1})
# {1: 'Alice', 3: 'Carl', 5: 'Liz'}</pre>
<p>And here’s an example that filters all (key, value) pairs with even keys:</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="">print({k:v for (k,v) in names.items() if k%2 == 0})
# {2: 'Bob', 4: 'Ann'}</pre>
<p>Let’s look at dictionary filtering by value! Is it any different?</p>
<h3>Filter Python Dictionary By Value Using Dictionary Comprehension</h3>
<p>No! It’s exactly the same:</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="">print({k:v for (k,v) in names.items() if len(v)&lt;5})
# {2: 'Bob', 3: 'Carl', 4: 'Ann', 5: 'Liz'}</pre>
<p>This powerful framework is not only fast and easy to understand, it’s also concise and consistent. The filtering criteria is the last part of the expression so that you can quickly grasp how it’s filtered:</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="">print({k:v for (k,v) in names.items() if v.startswith('A')})
# {1: 'Alice', 4: 'Ann'}</pre>
<p><strong>Try It Yourself in Our Interactive Cod Shell (Click “run”):</strong></p>
<p> <iframe src="https://repl.it/@finxter/filterDict4?lite=true" scrolling="no" allowtransparency="true" allowfullscreen="true" sandbox="allow-forms allow-pointer-lock allow-popups allow-same-origin allow-scripts allow-modals" width="100%" height="1100px" frameborder="no"></iframe> </p>
<p><strong>Related tutorials:</strong></p>
<ul>
<li><a rel="noreferrer noopener" href="https://blog.finxter.com/how-to-filter-a-list-of-lists-in-python/" target="_blank">How to Filter a List of Lists in Python?</a></li>
<li><a rel="noreferrer noopener" href="https://blog.finxter.com/python-lists-filter-vs-list-comprehension-which-is-faster/" target="_blank">Python Lists filter() vs List Comprehension – Which is Faster?</a></li>
<li><a rel="noreferrer noopener" href="https://blog.finxter.com/how-to-filter-a-list-in-python/" target="_blank">How to Filter a List in Python?</a></li>
<li><a rel="noreferrer noopener" href="https://blog.finxter.com/how-to-filter-a-list-of-dictionaries-in-python/" target="_blank">How to Filter a List of Dictionaries in Python?</a></li>
<li><a rel="noreferrer noopener" href="https://blog.finxter.com/how-to-filter-in-python-using-lambda-functions/" target="_blank">How to Filter in Python Using Lambda Functions?</a></li>
</ul>
<h2>All Four Methods for Copy&amp;Paste</h2>
<p>Here are all four methods from the tutorial to simplify copy&amp;pasting:</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="">names = {1: 'Alice', 2: 'Bob', 3: 'Carl', 4: 'Ann', 5: 'Liz'} ''' Method 1: Simple For Loop ''' # FILTER BY KEY
newDict = dict() # Iterate over all (k,v) pairs in names
for key, value in names.items(): # Is condition satisfied? if key%2 == 1: newDict[key] = value print(newDict)
# {1: 'Alice', 3: 'Carl', 5: 'Liz'} # FILTER BY VALUE
newDict = dict() # Iterate over all (k,v) pairs in names
for key, value in names.items(): # Is condition satisfied? if len(value)&lt;5: newDict[key] = value print(newDict)
# {2: 'Bob', 3: 'Carl', 4: 'Ann', 5: 'Liz'} ''' Method 2: Custom Function ''' def filter_dict(d, f): ''' Filters dictionary d by function f. ''' newDict = dict() # Iterate over all (k,v) pairs in names for key, value in d.items(): # Is condition satisfied? if f(key, value): newDict[key] = value return newDict # FILTER BY KEY
print(filter_dict(names, lambda k,v: k%2 == 1))
print(filter_dict(names, lambda k,v: k%2 == 0)) # FILTER BY VALUE
print(filter_dict(names, lambda k,v: len(v)&lt;5))
print(filter_dict(names, lambda k,v: v.startswith('A'))) ''' Method 3: filter() ''' # FILTER BY KEY
print(dict(filter(lambda x: x[0]%2 == 1, names.items())))
print(dict(filter(lambda x: x[0]%2 == 0, names.items()))) # FITER BY VALUE
print(dict(filter(lambda x: len(x[1])&lt;5, names.items())))
print(dict(filter(lambda x: x[1].startswith('A'), names.items()))) ''' Method 4: Dict Comprehension ''' # FITER BY KEY
print({k:v for (k,v) in names.items() if k%2 == 1})
print({k:v for (k,v) in names.items() if k%2 == 0}) # FITER BY VALUE
print({k:v for (k,v) in names.items() if len(v)&lt;5})
print({k:v for (k,v) in names.items() if v.startswith('A')})
</pre>
<p>But how do all of those methods compare in terms of algorithmic complexity and runtime? Let’s see…</p>
<h2>Algorithmic Analysis</h2>
<p>Before we benchmark those methods against each other, let’s quickly discuss computational complexity. </p>
<p>All four methods have linear runtime complexity in the number of elements in the original dictionary to be filtered—assuming that the filtering condition itself has constant runtime complexity (it’s independent of the number of elements in the dictionary). </p>
<figure class="wp-block-table is-style-stripes">
<table>
<thead>
<tr>
<th>Method</th>
<th>Complexity</th>
</tr>
</thead>
<tbody>
<tr>
<td>Method 1: Loop</td>
<td><em>O(n)</em></td>
</tr>
<tr>
<td>Method 2: Custom</td>
<td><em>O(n)</em></td>
</tr>
<tr>
<td>Method 3: filter()</td>
<td><em>O(n)</em></td>
</tr>
<tr>
<td>Method 4: Dictionary Comprehension</td>
<td><em>O(n)</em></td>
</tr>
</tbody>
</table>
</figure>
<p>But this doesn’t mean that all methods are equally efficient. The <a rel="noreferrer noopener" href="https://blog.finxter.com/python-lists-filter-vs-list-comprehension-which-is-faster/" target="_blank">dictionary comprehension is usually fastest</a> for these types of filtering operations because it doesn’t use an intermediate function <code>filter()</code>. And it’s also easiest to understand. Therefore, you should use dictionary comprehension in your own code to filter a dictionary by key or by value!</p>
<h2>Where to Go From Here?</h2>
<p>Enough theory, let’s get some practice!</p>
<p>To become successful in coding, you need to get out there and solve real problems for real people. That’s how you can become a six-figure earner easily. And that’s how you polish the skills you really need in practice. After all, what’s the use of learning theory that nobody ever needs?</p>
<p><strong>Practice projects is how you sharpen your saw in coding!</strong></p>
<p>Do you want to become a code master by focusing on practical code projects that actually earn you money and solve problems for people?</p>
<p>Then become a Python freelance developer! It’s the best way of approaching the task of improving your Python skills—even if you are a complete beginner.</p>
<p>Join my free webinar <a rel="noreferrer noopener" href="https://blog.finxter.com/webinar-freelancer/" target="_blank">“How to Build Your High-Income Skill Python”</a> and watch how I grew my coding business online and how you can, too—from the comfort of your own home.</p>
<p><a href="https://blog.finxter.com/webinar-freelancer/" target="_blank" rel="noreferrer noopener">Join the free webinar now!</a></p>
</div>


https://www.sickgaming.net/blog/2020/05/...honic-way/
Reply



Forum Jump:


Users browsing this thread:
1 Guest(s)

Forum software by © MyBB Theme © iAndrew 2016