list comprehension question

Steven D'Aprano steven at REMOVE.THIS.cybersource.com.au
Tue May 5 21:52:24 EDT 2009


On Tue, 05 May 2009 13:43:32 -0400, J. Cliff Dyer wrote:

> On Fri, 2009-05-01 at 13:00 -0400, John Posner wrote:
>> Shane Geiger wrote:
>> >    if type(el) == list or type(el) is tuple:
>> A tiny improvement:
>> 
>>         if type(el) in (list, tuple):
>> 
>> 
> Another alternative, which might be useful in some cases:
> 
>           if hasattr(el, '__iter__'):
> 
> This covers all iterables, not just lists and tuples.

Except for the ones that it doesn't cover, like strings:

>>> hasattr('abcd', '__iter__')
False
>>> list(iter('abcd'))
['a', 'b', 'c', 'd']


And classes that follow the sequence protocol:


>>> class Spam:
...     def __getitem__(self, index):
...             if 0 <= index < 5:
...                     return "spam"
...             raise IndexError
...
>>> hasattr(Spam(), '__iter__')
False
>>> list(iter(Spam()))
['spam', 'spam', 'spam', 'spam', 'spam']




-- 
Steven



More information about the Python-list mailing list