Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Extended tuple unpacking in Python 2

Is it possible to simulate extended tuple unpacking in Python 2?

Specifically, I have a for loop:

for a, b, c in mylist: 

which works fine when mylist is a list of tuples of size three. I want the same for loop to work if I pass in a list of size four.

I think I will end up using named tuples, but I was wondering if there is an easy way to write:

for a, b, c, *d in mylist: 

so that d eats up any extra members.

like image 770
Neil G Avatar asked Mar 17 '11 01:03

Neil G


People also ask

What is unpacking of tuple in Python?

Python offers a very powerful tuple assignment tool that maps right hand side arguments into left hand side arguments. THis act of mapping together is known as unpacking of a tuple of values into a norml variable. WHereas in packing, we put values into a regular tuple by means of regular assignment.

Is unpacking possible in a tuple?

In python tuples can be unpacked using a function in function tuple is passed and in function values are unpacked into normal variable.

Can we use extend with tuple?

The extend() method in Python can be used by passing any type of iterable as an argument to it, be it a list, tuple, string, set or dictionary.

How do you expand a tuple in Python?

To expand tuples into arguments with Python, we can use the * operator. to unpack the tuple (1, 2, 3) with * as the arguments of add . Therefore, a is 1, b is 2, and c is 3.


2 Answers

You can't do that directly, but it isn't terribly difficult to write a utility function to do this:

>>> def unpack_list(a, b, c, *d): ...   return a, b, c, d ...  >>> unpack_list(*range(100)) (0, 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)) 

You could apply it to your for loop like this:

for sub_list in mylist:     a, b, c, d = unpack_list(*sub_list) 
like image 96
Jason Baker Avatar answered Sep 19 '22 13:09

Jason Baker


You could define a wrapper function that converts your list to a four tuple. For example:

def wrapper(thelist):     for item in thelist:         yield(item[0], item[1], item[2], item[3:])  mylist = [(1,2,3,4), (5,6,7,8)]  for a, b, c, d in wrapper(mylist):     print a, b, c, d 

The code prints:

1 2 3 (4,) 5 6 7 (8,) 
like image 33
srgerg Avatar answered Sep 21 '22 13:09

srgerg