How to Sum Elements of Two Lists in Python

How to Sum Elements of Two Lists in Python Featured Image

Welcome back to another edition of the Python Bytes 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 the other day. Let’s see how it goes!

Table of Contents

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:

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

However, I was stuck retrieving the lists separately:

[1, [7], [2], [8374163], [84302738]]
[1, [7], [1], [2314567], [0]]

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 just merging the two lists by hand. In other words, we might try the following:

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]
]

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:

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)]

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

all_devices = [sum(pair) for pair in zip(ethernet_devices, usb_devices)]

In this comprehension, we cut down on the local variables by taking advantage of the iterator (sorry Python 2.x folks). In either case, we’ve managed to sum elements of two lists in a much more Pythonic way.

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:

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))

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:

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)

However, numpy is a massive library. 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.

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)]

# But wait, there's more! Python 3 only...
all_devices = [sum(pair) for pair 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)

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. Tune in next time for to learn how to check if a file exists in Python.

Series Navigation← How to Invert a Dictionary in PythonHow to Check if a File Exists in Python →
Advertisements

1 thought on “How to Sum Elements of Two Lists in Python

  1. Pingback: Python Wrangler Part 2 | Tech Herald

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.