An intro to Deque module

Hi there folks. Recently I got to know about the Python deque module. It is a part of the collections library. It provides you with a double ended queue which means that you can append and delete elements from either side of the list. So without wasting any time lets begin. First of all you have to import the deque module from the collections library. This can be done by typing:

from collections import deque

Now we can instantiate a deque object.

d = deque()

That was simple. It works like python lists and provides you with somewhat similar methods as well. For example you can do:

d = deque()
d.append('1')
d.append('2')
d.append('3')
len(d)
d[0]
d[-1]

output:

3
'1'
'3'

You can pop values from both sides of the deque. This means that you can do this:

d = deque('12345')
len(d)
d.popleft()
d.pop()
d

Output:

5 
'1' 
'5' 
deque(['2', '3', '4'])

We can also limit the amount of items a deque can hold. By doing this when we achieve the maximum limit of out deque it will simply pop out the items from the opposite end. It is better to explain it using an example so here you go:

d = deque(maxlen=30)

Now whenever you insert values after 30, the leftmost value will be popped from the list. You can also expand the list in any direction with new values:

d = deque([1,2,3,4,5])
d.extendleft([0])
d.extend([6,7,8])
d

Output:

deque([0, 1, 2, 3, 4, 5, 6, 7, 8])

So that’s it! That was a basic overview of the deque module in Python stdlib. I hope you learned something new today. I hope to see you guys later and don’t forget to follow this blog to get your daily dose of Python tips and tutorials. For further reading I would suggest the following links:

Advertisements

10 thoughts on “An intro to Deque module”

  1. > Now whenever you insert values after 30, the leftmost value will be popped from the list.

    This is correct, assuming you’re just “append”-ing. If you “appendleft”, the rightmost value will be dropped. Cool tip!

  2. Is there a way to insert an element into a deque in an arbitrary position? I mean, something analogous to the insert method in list?

    1. No. As far as I know you can not do it. However, if that is really what you want to do then you can adopt a somewhat hacky way of first converting it into a list, inserting the element in an arbitrary position and then casting it back into a deque. But I would not recommend that.

      1. Okay, yes I too think that converting into a list and then inserting might not be a good idea . I thought insertion and deletion from a deque is less expensive than from a list but I suppose that’s only true if I insert/delete from the beginning or end. So maybe even the least computationally expensive way to insert into an arbitrary position would be by using a list. Anyway, thank you very much for your time.

  3. Hi there, thanks for your write-up on this matter. All your stuff is really helpful.
    Noob to python here.

    I’m assuming that deques allow for string elements? Is there a way to force the container to accommodate only integers for example?

    Secondly, if I wanted to insert double-digit numbers into the list. My attempt has been unsuccessful – e.g. how do I return the element ’10’ in the list?

    import collections
    t=collections.deque(‘12345678910’)
    print(t)

    deque([‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’, ‘1’, ‘0’])

    Finally, what’s the best way to sum the elements in the container? Would it be necessary to loop through the list and sum iteratively?

    1. Hi David!

      I am assuming that when adding something to the deque you can add a check for whether the item being added is an integer or not. This is pretty easy by using the type() function.

      In order to accommodate 10 as well, you can initialise the deque like this:

      t=collections.deque([1,2,3,4,5,6,7,8,9,10])

      As far as summing the elements go, I would personally prefer to use a list comprehension and the sum function like this:

      total = sum([int(elem) for elem in t])

      In this case I am assuming that the deque might have integers in string form. If you know for sure that the elements are all integers you can omit “int”.

      I hope my answer helps you. If you still have any questions please let me know!

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

w

Connecting to %s