Best idiom to unpack a variable-size sequence

Duncan Booth duncan.booth at invalid.invalid
Tue Dec 18 13:14:06 EST 2007


ram <rickmorrison at gmail.com> wrote:

> Here's a little issue I run into more than I like: I often need to
> unpack a sequence that may be too short or too long into a fixed-size
> set of items:
> 
> a, b, c = seq      # when seq = (1, 2, 3, 4, ...) or seq = (1, 2)
> 
> What I usually do is something like this:
> 
>      a, b, c = (list(seq) + [None, None, None])[:3]
> 
> but that just feels rather ugly to me -- is there a good Pythonic
> idiom for this?

Pythonic might be to be explicit: i.e. know in advance how long the 
sequence actually is.

One drawback I see with your code is that it doesn't give you any way to 
specify different defaults for the values. So here's an alternative to 
consider: try passing your sequence to a function. This lets you specify 
appropriate defaults, and it reads quite cleanly. Of course it also forces 
you to extract the code using those variables out into a separate function, 
but that may not be a bad thing.

>>> def process(a=None, b=None, c=None):
	print a, b, c

	
>>> seq = iter('abcd')
>>> process(*itertools.islice(seq,0,3))
a b c
>>> seq = iter('ab')
>>> process(*itertools.islice(seq,0,3))
a b None
>>> 



More information about the Python-list mailing list