Python Sum of List How to Sum Elements of Two Lists in Python

How to Python (14 Part Series)

1 How to Check if a File Exists in Python
2 How to Check if a List is Empty in Python
10 more parts…
3 How to Invert a Dictionary in Python: Comprehensions, Defaultdict, and More
4 How to Sum Elements of Two Lists in Python
5 How to Parse a Spreadsheet in Python
6 How to Sort a List of Dictionaries in Python
7 How to Write a List Comprehension in Python
8 How to Merge Two Dictionaries in Python
9 How to Print on the Same Line in Python: Print and Write
10 How to Compare Strings in Python: Equality and Identity
11 How to Performance Test Python Code: timeit, cProfile, and More
12 How to Perform a Reverse Dictionary Lookup in Python: Generator Expressions and More
13 How to Check if a String Contains a Substring in Python: In, Index, and More
14 How to Add an Item to a List in Python: Append, Slice Assignment, and More

Welcome back to another edition of the How to Python series. This time I want to sum elements of two lists in Python. I got the inspiration for this topic while trying to do just this at work, so let’s see how it goes!

Problem Introduction

Recently, I ran into a problem where a library wasn’t working exactly how I wanted, so I had to hack together the results to make my life a bit easier. In this scenario, I had a connection library which I was using to list all the available devices. However, the list functionality short circuited for certain types of connections, so it never actually listed everything. As a result, I was forced to run the function twice: once for USB and again for Ethernet.

The results of this list function returned a list that looked something like the following:

<span># [size, [types], [interfaces], [serial numbers], [IP addresses]] </span><span>[</span><span>2</span><span>,</span> <span>[</span><span>7</span><span>,</span> <span>7</span><span>],</span> <span>[</span><span>1</span><span>,</span> <span>2</span><span>],</span> <span>[</span><span>2314567</span><span>,</span> <span>8374163</span><span>],</span> <span>[</span><span>0</span><span>,</span> <span>84302738</span><span>]]</span>
<span># [size, [types], [interfaces], [serial numbers], [IP addresses]] </span><span>[</span><span>2</span><span>,</span> <span>[</span><span>7</span><span>,</span> <span>7</span><span>],</span> <span>[</span><span>1</span><span>,</span> <span>2</span><span>],</span> <span>[</span><span>2314567</span><span>,</span> <span>8374163</span><span>],</span> <span>[</span><span>0</span><span>,</span> <span>84302738</span><span>]]</span>
# [size, [types], [interfaces], [serial numbers], [IP addresses]] [2, [7, 7], [1, 2], [2314567, 8374163], [0, 84302738]]

Enter fullscreen mode Exit fullscreen mode

However, I was stuck retrieving the lists separately:

<span>[</span><span>1</span><span>,</span> <span>[</span><span>7</span><span>],</span> <span>[</span><span>2</span><span>],</span> <span>[</span><span>8374163</span><span>],</span> <span>[</span><span>84302738</span><span>]]</span> <span># Ethernet </span><span>[</span><span>1</span><span>,</span> <span>[</span><span>7</span><span>],</span> <span>[</span><span>1</span><span>],</span> <span>[</span><span>2314567</span><span>],</span> <span>[</span><span>0</span><span>]]</span> <span># USB </span>
<span>[</span><span>1</span><span>,</span> <span>[</span><span>7</span><span>],</span> <span>[</span><span>2</span><span>],</span> <span>[</span><span>8374163</span><span>],</span> <span>[</span><span>84302738</span><span>]]</span>  <span># Ethernet </span><span>[</span><span>1</span><span>,</span> <span>[</span><span>7</span><span>],</span> <span>[</span><span>1</span><span>],</span> <span>[</span><span>2314567</span><span>],</span> <span>[</span><span>0</span><span>]]</span>  <span># USB </span>
[1, [7], [2], [8374163], [84302738]] # Ethernet [1, [7], [1], [2314567], [0]] # USB

Enter fullscreen mode Exit fullscreen mode

Naturally, I wanted to be able to merge the two lists back into what I was expecting initially. However, I wasn’t totally sure how I was going to do that. So, let’s take a look at some possible solutions.

Solutions

When it comes to merging two lists, there are several possible ways to do it. Here are just a few.

Merge Two Lists by Hand

At first, we might try merging the two lists by hand. In other words, we might try the following:

<span>ethernet_devices</span> <span>=</span> <span>[</span><span>1</span><span>,</span> <span>[</span><span>7</span><span>],</span> <span>[</span><span>2</span><span>],</span> <span>[</span><span>8374163</span><span>],</span> <span>[</span><span>84302738</span><span>]]</span>
<span>usb_devices</span> <span>=</span> <span>[</span><span>1</span><span>,</span> <span>[</span><span>7</span><span>],</span> <span>[</span><span>1</span><span>],</span> <span>[</span><span>2314567</span><span>],</span> <span>[</span><span>0</span><span>]]</span>
<span>all_devices</span> <span>=</span> <span>[</span>
<span>ethernet_devices</span><span>[</span><span>0</span><span>]</span> <span>+</span> <span>usb_devices</span><span>[</span><span>0</span><span>],</span>
<span>ethernet_devices</span><span>[</span><span>1</span><span>]</span> <span>+</span> <span>usb_devices</span><span>[</span><span>1</span><span>],</span>
<span>ethernet_devices</span><span>[</span><span>2</span><span>]</span> <span>+</span> <span>usb_devices</span><span>[</span><span>2</span><span>],</span>
<span>ethernet_devices</span><span>[</span><span>3</span><span>]</span> <span>+</span> <span>usb_devices</span><span>[</span><span>3</span><span>],</span>
<span>ethernet_devices</span><span>[</span><span>4</span><span>]</span> <span>+</span> <span>usb_devices</span><span>[</span><span>4</span><span>]</span>
<span>]</span>
<span>ethernet_devices</span> <span>=</span> <span>[</span><span>1</span><span>,</span> <span>[</span><span>7</span><span>],</span> <span>[</span><span>2</span><span>],</span> <span>[</span><span>8374163</span><span>],</span> <span>[</span><span>84302738</span><span>]]</span>
<span>usb_devices</span> <span>=</span> <span>[</span><span>1</span><span>,</span> <span>[</span><span>7</span><span>],</span> <span>[</span><span>1</span><span>],</span> <span>[</span><span>2314567</span><span>],</span> <span>[</span><span>0</span><span>]]</span>
<span>all_devices</span> <span>=</span> <span>[</span>
    <span>ethernet_devices</span><span>[</span><span>0</span><span>]</span> <span>+</span> <span>usb_devices</span><span>[</span><span>0</span><span>],</span>
    <span>ethernet_devices</span><span>[</span><span>1</span><span>]</span> <span>+</span> <span>usb_devices</span><span>[</span><span>1</span><span>],</span>
    <span>ethernet_devices</span><span>[</span><span>2</span><span>]</span> <span>+</span> <span>usb_devices</span><span>[</span><span>2</span><span>],</span>
    <span>ethernet_devices</span><span>[</span><span>3</span><span>]</span> <span>+</span> <span>usb_devices</span><span>[</span><span>3</span><span>],</span>
    <span>ethernet_devices</span><span>[</span><span>4</span><span>]</span> <span>+</span> <span>usb_devices</span><span>[</span><span>4</span><span>]</span>
<span>]</span>
ethernet_devices = [1, [7], [2], [8374163], [84302738]] usb_devices = [1, [7], [1], [2314567], [0]] all_devices = [ ethernet_devices[0] + usb_devices[0], ethernet_devices[1] + usb_devices[1], ethernet_devices[2] + usb_devices[2], ethernet_devices[3] + usb_devices[3], ethernet_devices[4] + usb_devices[4] ]

Enter fullscreen mode Exit fullscreen mode

Now, that solution is hardly elegant, but it gets the job done. However, there has to be a better way. After all, we are already taking advantage of the fact that lists can be merged using the same operator as addition. Why not take advantage of this property in a loop?

Sum Elements of Two Lists with a Comprehension

Just like the last lesson on inverting dictionaries in Python, we can take advantage of comprehensions to dramatically simplify this problem. Let’s take a look:

<span>ethernet_devices</span> <span>=</span> <span>[</span><span>1</span><span>,</span> <span>[</span><span>7</span><span>],</span> <span>[</span><span>2</span><span>],</span> <span>[</span><span>8374163</span><span>],</span> <span>[</span><span>84302738</span><span>]]</span>
<span>usb_devices</span> <span>=</span> <span>[</span><span>1</span><span>,</span> <span>[</span><span>7</span><span>],</span> <span>[</span><span>1</span><span>],</span> <span>[</span><span>2314567</span><span>],</span> <span>[</span><span>0</span><span>]]</span>
<span>all_devices</span> <span>=</span> <span>[</span><span>x</span> <span>+</span> <span>y</span> <span>for</span> <span>x</span><span>,</span> <span>y</span> <span>in</span> <span>zip</span><span>(</span><span>ethernet_devices</span><span>,</span> <span>usb_devices</span><span>)]</span>
<span>ethernet_devices</span> <span>=</span> <span>[</span><span>1</span><span>,</span> <span>[</span><span>7</span><span>],</span> <span>[</span><span>2</span><span>],</span> <span>[</span><span>8374163</span><span>],</span> <span>[</span><span>84302738</span><span>]]</span>
<span>usb_devices</span> <span>=</span> <span>[</span><span>1</span><span>,</span> <span>[</span><span>7</span><span>],</span> <span>[</span><span>1</span><span>],</span> <span>[</span><span>2314567</span><span>],</span> <span>[</span><span>0</span><span>]]</span>
<span>all_devices</span> <span>=</span> <span>[</span><span>x</span> <span>+</span> <span>y</span> <span>for</span> <span>x</span><span>,</span> <span>y</span> <span>in</span> <span>zip</span><span>(</span><span>ethernet_devices</span><span>,</span> <span>usb_devices</span><span>)]</span>
ethernet_devices = [1, [7], [2], [8374163], [84302738]] usb_devices = [1, [7], [1], [2314567], [0]] all_devices = [x + y for x, y in zip(ethernet_devices, usb_devices)]

Enter fullscreen mode Exit fullscreen mode

Now we’re talking! That’s five lines of tedious mapping compressed down into a simple list comprehension. But wait, it gets better:

<span>all_devices</span> <span>=</span> <span>[</span><span>sum</span><span>(</span><span>pair</span><span>)</span> <span>for</span> <span>pair</span> <span>in</span> <span>zip</span><span>(</span><span>ethernet_devices</span><span>,</span> <span>usb_devices</span><span>)]</span>
<span>all_devices</span> <span>=</span> <span>[</span><span>sum</span><span>(</span><span>pair</span><span>)</span> <span>for</span> <span>pair</span> <span>in</span> <span>zip</span><span>(</span><span>ethernet_devices</span><span>,</span> <span>usb_devices</span><span>)]</span>
all_devices = [sum(pair) for pair in zip(ethernet_devices, usb_devices)]

Enter fullscreen mode Exit fullscreen mode

Or, does it? Thanks to our fried, rhymes, we’ll notice that this solution doesn’t actually work for our situation. While it does a great job summing integers in an iterable, it crashes when trying to merge two sublists with the following error:

Traceback <span>(</span>most recent call last<span>)</span>:
File <span>"<pyshell#3>"</span>, line 1, <span>in</span> <module>
all_devices <span>=</span> <span>[</span><span>sum</span><span>(</span>pair<span>)</span> <span>for </span>pair <span>in </span>zip<span>(</span>ethernet_devices, usb_devices<span>)]</span>
File <span>"<pyshell#3>"</span>, line 1, <span>in</span> <listcomp>
all_devices <span>=</span> <span>[</span><span>sum</span><span>(</span>pair<span>)</span> <span>for </span>pair <span>in </span>zip<span>(</span>ethernet_devices, usb_devices<span>)]</span>
TypeError: unsupported operand <span>type</span><span>(</span>s<span>)</span> <span>for</span> +: <span>'int'</span> and <span>'list'</span>
Traceback <span>(</span>most recent call last<span>)</span>:
  File <span>"<pyshell#3>"</span>, line 1, <span>in</span> <module>
    all_devices <span>=</span> <span>[</span><span>sum</span><span>(</span>pair<span>)</span> <span>for </span>pair <span>in </span>zip<span>(</span>ethernet_devices, usb_devices<span>)]</span>
  File <span>"<pyshell#3>"</span>, line 1, <span>in</span> <listcomp>
    all_devices <span>=</span> <span>[</span><span>sum</span><span>(</span>pair<span>)</span> <span>for </span>pair <span>in </span>zip<span>(</span>ethernet_devices, usb_devices<span>)]</span>
TypeError: unsupported operand <span>type</span><span>(</span>s<span>)</span> <span>for</span> +: <span>'int'</span> and <span>'list'</span>
Traceback (most recent call last): File "<pyshell#3>", line 1, in <module> all_devices = [sum(pair) for pair in zip(ethernet_devices, usb_devices)] File "<pyshell#3>", line 1, in <listcomp> all_devices = [sum(pair) for pair in zip(ethernet_devices, usb_devices)] TypeError: unsupported operand type(s) for +: 'int' and 'list'

Enter fullscreen mode Exit fullscreen mode

That said, you may find it useful for merging two lists of strictly integers.

Sum Elements of Two Lists with a Mapping

At this point, we’ve basically answered our question. However, there is another solution which requires arguably even less code. Check it out:

<span>ethernet_devices</span> <span>=</span> <span>[</span><span>1</span><span>,</span> <span>[</span><span>7</span><span>],</span> <span>[</span><span>2</span><span>],</span> <span>[</span><span>8374163</span><span>],</span> <span>[</span><span>84302738</span><span>]]</span>
<span>usb_devices</span> <span>=</span> <span>[</span><span>1</span><span>,</span> <span>[</span><span>7</span><span>],</span> <span>[</span><span>1</span><span>],</span> <span>[</span><span>2314567</span><span>],</span> <span>[</span><span>0</span><span>]]</span>
<span>import</span> <span>operator</span>
<span>all_devices</span> <span>=</span> <span>list</span><span>(</span><span>map</span><span>(</span><span>operator</span><span>.</span><span>add</span><span>,</span> <span>ethernet_devices</span><span>,</span> <span>usb_devices</span><span>))</span>
<span>ethernet_devices</span> <span>=</span> <span>[</span><span>1</span><span>,</span> <span>[</span><span>7</span><span>],</span> <span>[</span><span>2</span><span>],</span> <span>[</span><span>8374163</span><span>],</span> <span>[</span><span>84302738</span><span>]]</span>
<span>usb_devices</span> <span>=</span> <span>[</span><span>1</span><span>,</span> <span>[</span><span>7</span><span>],</span> <span>[</span><span>1</span><span>],</span> <span>[</span><span>2314567</span><span>],</span> <span>[</span><span>0</span><span>]]</span>
<span>import</span> <span>operator</span>
<span>all_devices</span> <span>=</span> <span>list</span><span>(</span><span>map</span><span>(</span><span>operator</span><span>.</span><span>add</span><span>,</span> <span>ethernet_devices</span><span>,</span> <span>usb_devices</span><span>))</span>
ethernet_devices = [1, [7], [2], [8374163], [84302738]] usb_devices = [1, [7], [1], [2314567], [0]] import operator all_devices = list(map(operator.add, ethernet_devices, usb_devices))

Enter fullscreen mode Exit fullscreen mode

Not totally certain of the performance impact here, but it sure is a pretty solution. Of course, we also need to add a dependency which does make this solution a bit less attractive. In fact, if we were going to go down that road, we could easily leverage numpy:

<span>ethernet_devices</span> <span>=</span> <span>[</span><span>1</span><span>,</span> <span>[</span><span>7</span><span>],</span> <span>[</span><span>2</span><span>],</span> <span>[</span><span>8374163</span><span>],</span> <span>[</span><span>84302738</span><span>]]</span>
<span>usb_devices</span> <span>=</span> <span>[</span><span>1</span><span>,</span> <span>[</span><span>7</span><span>],</span> <span>[</span><span>1</span><span>],</span> <span>[</span><span>2314567</span><span>],</span> <span>[</span><span>0</span><span>]]</span>
<span>import</span> <span>numpy</span> <span>as</span> <span>np</span>
<span>all_devices</span> <span>=</span> <span>np</span><span>.</span><span>add</span><span>(</span><span>ethernet_devices</span><span>,</span> <span>usb_devices</span><span>)</span>
<span>ethernet_devices</span> <span>=</span> <span>[</span><span>1</span><span>,</span> <span>[</span><span>7</span><span>],</span> <span>[</span><span>2</span><span>],</span> <span>[</span><span>8374163</span><span>],</span> <span>[</span><span>84302738</span><span>]]</span>
<span>usb_devices</span> <span>=</span> <span>[</span><span>1</span><span>,</span> <span>[</span><span>7</span><span>],</span> <span>[</span><span>1</span><span>],</span> <span>[</span><span>2314567</span><span>],</span> <span>[</span><span>0</span><span>]]</span>
<span>import</span> <span>numpy</span> <span>as</span> <span>np</span>
<span>all_devices</span> <span>=</span> <span>np</span><span>.</span><span>add</span><span>(</span><span>ethernet_devices</span><span>,</span> <span>usb_devices</span><span>)</span>
ethernet_devices = [1, [7], [2], [8374163], [84302738]] usb_devices = [1, [7], [1], [2314567], [0]] import numpy as np all_devices = np.add(ethernet_devices, usb_devices)

Enter fullscreen mode Exit fullscreen mode

However, numpy is a massive library, so we should probably stick with our list comprehensions.

A Little Recap

Using the handful of methods above, we should be able to sum elements of two lists.

<span>ethernet_devices</span> <span>=</span> <span>[</span><span>1</span><span>,</span> <span>[</span><span>7</span><span>],</span> <span>[</span><span>2</span><span>],</span> <span>[</span><span>8374163</span><span>],</span> <span>[</span><span>84302738</span><span>]]</span>
<span>usb_devices</span> <span>=</span> <span>[</span><span>1</span><span>,</span> <span>[</span><span>7</span><span>],</span> <span>[</span><span>1</span><span>],</span> <span>[</span><span>2314567</span><span>],</span> <span>[</span><span>0</span><span>]]</span>
<span># The long way </span><span>all_devices</span> <span>=</span> <span>[</span>
<span>ethernet_devices</span><span>[</span><span>0</span><span>]</span> <span>+</span> <span>usb_devices</span><span>[</span><span>0</span><span>],</span>
<span>ethernet_devices</span><span>[</span><span>1</span><span>]</span> <span>+</span> <span>usb_devices</span><span>[</span><span>1</span><span>],</span>
<span>ethernet_devices</span><span>[</span><span>2</span><span>]</span> <span>+</span> <span>usb_devices</span><span>[</span><span>2</span><span>],</span>
<span>ethernet_devices</span><span>[</span><span>3</span><span>]</span> <span>+</span> <span>usb_devices</span><span>[</span><span>3</span><span>],</span>
<span>ethernet_devices</span><span>[</span><span>4</span><span>]</span> <span>+</span> <span>usb_devices</span><span>[</span><span>4</span><span>]</span>
<span>]</span>
<span># Some comprehension magic </span><span>all_devices</span> <span>=</span> <span>[</span><span>x</span> <span>+</span> <span>y</span> <span>for</span> <span>x</span><span>,</span> <span>y</span> <span>in</span> <span>zip</span><span>(</span><span>ethernet_devices</span><span>,</span> <span>usb_devices</span><span>)]</span>
<span># Let's use maps </span><span>import</span> <span>operator</span>
<span>all_devices</span> <span>=</span> <span>list</span><span>(</span><span>map</span><span>(</span><span>operator</span><span>.</span><span>add</span><span>,</span> <span>ethernet_devices</span><span>,</span> <span>usb_devices</span><span>))</span>
<span># We can't forget our favorite computation library </span><span>import</span> <span>numpy</span> <span>as</span> <span>np</span>
<span>all_devices</span> <span>=</span> <span>np</span><span>.</span><span>add</span><span>(</span><span>ethernet_devices</span><span>,</span> <span>usb_devices</span><span>)</span>
<span>ethernet_devices</span> <span>=</span> <span>[</span><span>1</span><span>,</span> <span>[</span><span>7</span><span>],</span> <span>[</span><span>2</span><span>],</span> <span>[</span><span>8374163</span><span>],</span> <span>[</span><span>84302738</span><span>]]</span>
<span>usb_devices</span> <span>=</span> <span>[</span><span>1</span><span>,</span> <span>[</span><span>7</span><span>],</span> <span>[</span><span>1</span><span>],</span> <span>[</span><span>2314567</span><span>],</span> <span>[</span><span>0</span><span>]]</span>

<span># The long way </span><span>all_devices</span> <span>=</span> <span>[</span>
    <span>ethernet_devices</span><span>[</span><span>0</span><span>]</span> <span>+</span> <span>usb_devices</span><span>[</span><span>0</span><span>],</span>
    <span>ethernet_devices</span><span>[</span><span>1</span><span>]</span> <span>+</span> <span>usb_devices</span><span>[</span><span>1</span><span>],</span>
    <span>ethernet_devices</span><span>[</span><span>2</span><span>]</span> <span>+</span> <span>usb_devices</span><span>[</span><span>2</span><span>],</span>
    <span>ethernet_devices</span><span>[</span><span>3</span><span>]</span> <span>+</span> <span>usb_devices</span><span>[</span><span>3</span><span>],</span>
    <span>ethernet_devices</span><span>[</span><span>4</span><span>]</span> <span>+</span> <span>usb_devices</span><span>[</span><span>4</span><span>]</span>
<span>]</span>

<span># Some comprehension magic </span><span>all_devices</span> <span>=</span> <span>[</span><span>x</span> <span>+</span> <span>y</span> <span>for</span> <span>x</span><span>,</span> <span>y</span> <span>in</span> <span>zip</span><span>(</span><span>ethernet_devices</span><span>,</span> <span>usb_devices</span><span>)]</span>

<span># Let's use maps </span><span>import</span> <span>operator</span> 
<span>all_devices</span> <span>=</span> <span>list</span><span>(</span><span>map</span><span>(</span><span>operator</span><span>.</span><span>add</span><span>,</span> <span>ethernet_devices</span><span>,</span> <span>usb_devices</span><span>))</span>

<span># We can't forget our favorite computation library </span><span>import</span> <span>numpy</span> <span>as</span> <span>np</span> 
<span>all_devices</span> <span>=</span> <span>np</span><span>.</span><span>add</span><span>(</span><span>ethernet_devices</span><span>,</span> <span>usb_devices</span><span>)</span>
ethernet_devices = [1, [7], [2], [8374163], [84302738]] usb_devices = [1, [7], [1], [2314567], [0]] # The long way all_devices = [ ethernet_devices[0] + usb_devices[0], ethernet_devices[1] + usb_devices[1], ethernet_devices[2] + usb_devices[2], ethernet_devices[3] + usb_devices[3], ethernet_devices[4] + usb_devices[4] ] # Some comprehension magic all_devices = [x + y for x, y in zip(ethernet_devices, usb_devices)] # Let's use maps import operator all_devices = list(map(operator.add, ethernet_devices, usb_devices)) # We can't forget our favorite computation library import numpy as np all_devices = np.add(ethernet_devices, usb_devices)

Enter fullscreen mode Exit fullscreen mode

As we can see, there are a lot of ways to run an element-wise sum of two lists. Take your pick.

As always, thanks for stopping by! If you’re interested in learning more about Python, consider subscribing to The Renegade Coder, so you’ll never miss another article.

How to Python (14 Part Series)

1 How to Check if a File Exists in Python
2 How to Check if a List is Empty in Python
10 more parts…
3 How to Invert a Dictionary in Python: Comprehensions, Defaultdict, and More
4 How to Sum Elements of Two Lists in Python
5 How to Parse a Spreadsheet in Python
6 How to Sort a List of Dictionaries in Python
7 How to Write a List Comprehension in Python
8 How to Merge Two Dictionaries in Python
9 How to Print on the Same Line in Python: Print and Write
10 How to Compare Strings in Python: Equality and Identity
11 How to Performance Test Python Code: timeit, cProfile, and More
12 How to Perform a Reverse Dictionary Lookup in Python: Generator Expressions and More
13 How to Check if a String Contains a Substring in Python: In, Index, and More
14 How to Add an Item to a List in Python: Append, Slice Assignment, and More

原文链接:Python Sum of List How to Sum Elements of Two Lists in Python

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
If we believe that tomorrow will be better, we can bear a hardship today.
如果我们相信明天会更好,今天就能承受艰辛
评论 抢沙发

请登录后发表评论

    暂无评论内容