What's an elegant way to test for list index existing?

Peter Otten __peter__ at web.de
Sat Sep 29 03:23:06 EDT 2018


jladasky at itu.edu wrote:

> On Friday, September 28, 2018 at 11:03:17 AM UTC-7, Chris Green wrote:
>> I have a list created by:-
>> 
>>     fld = shlex.split(ln)
>> 
>> It may contain 3, 4 or 5 entries according to data read into ln.
>> What's the neatest way of setting the fourth and fifth entries to an
>> empty string if they don't (yet) exist? Using 'if len(fld) < 4:' feels
>> clumsy somehow.
> 
> How about this?
> 
> from itertools import chain, repeat
> temp = shlex.split(ln)
> fld = list(chain(temp, repeat("", 5-len(temp))))

If you are OK with silently dropping extra entries

fld = list(islice(chain(shlex.split(ln), repeat("")), 5))

or its non-itertools equivalent

fld = (shlex.split(ln) + [""] * 5)[:5]

are also possible. Personally I consider none of these to be elegant.
If you are going to unpack the fld entries I'd do it in a function with 
default values:

>>> def use_args(foo, bar, baz, ham="", spam=""):
...     print("\n".join("{} = {!r}".format(*p) for p in locals().items()))
... 
>>> use_args(*shlex.split("a b c"))
spam = ''
ham = ''
baz = 'c'
foo = 'a'
bar = 'b'
>>> use_args(*shlex.split("a b c d"))
spam = ''
ham = 'd'
baz = 'c'
foo = 'a'
bar = 'b'

This has the advantage that it fails for the unforeseen cases:

>>> use_args(*shlex.split("a b c d e f"))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: use_args() takes from 3 to 5 positional arguments but 6 were 
given
>>> use_args(*shlex.split("a b"))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: use_args() missing 1 required positional argument: 'baz'





More information about the Python-list mailing list