Unpaking Tuple
Steven D'Aprano
steve+comp.lang.python at pearwood.info
Sat Oct 6 11:08:38 EDT 2012
More information about the Python-list mailing list
Sat Oct 6 11:08:38 EDT 2012
- Previous message (by thread): Unpaking Tuple
- Next message (by thread): Unpaking Tuple
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
On Sat, 06 Oct 2012 08:46:28 -0400, Roy Smith wrote: > In article <mailman.1898.1349519275.27098.python-list at python.org>, > Chris Rebert <clp2 at rebertia.com> wrote: > >> But at any rate: >> shortfall = 4 - len(your_tuple) >> your_tuple += (None,) * shortfall # assuming None is a suitable default >> a, b, c, d = your_tuple >> >> If you also need to handle the "too many items" case, use slicing: a, >> b, c, d = your_tuple[:4] > > I usually handle both of those cases at the same time: > >>>> a, b, c, d = (my_tuple + (None,) * 4)[:4] While that's fine for small tuples, if somebody wanted to mess with you, and passed (say) a million-item tuple, that would unnecessarily copy all million items before throwing all but four away. For the sake of a two-liner instead of a one-liner, you can avoid such nasty surprises: my_tuple = my_tuple[:4] a,b,c,d = my_tuple if len(my_tuple) == 4 else (my_tuple + (None,)*4)[:4] A similar solution: a,b,c,d = (my_tuple[:4] + (None, None, None, None))[:4] Here's a dumb one-liner, good for making people laugh at you: a,b,c,d = (x for i,x in enumerate(my_tuple + (None,)*4) if i < 4) and an obfuscated solution: from itertools import izip_longest as izip a,b,c,d = (None if x == (None,None) else x[0][1] for x in izip(zip ('izip', my_tuple), (None for izip in 'izip'))) But in my opinion, the best solution of all is a three-liner: if len(my_tuple) < 4: my_tuple += (None,)*(4 - len(my_tuple)) a,b,c,d = my_tuple[4:] -- Steven
- Previous message (by thread): Unpaking Tuple
- Next message (by thread): Unpaking Tuple
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Python-list mailing list