Lisp mentality vs. Python mentality

Steven D'Aprano steve at REMOVE-THIS-cybersource.com.au
Sun Apr 26 02:56:38 EDT 2009


On Sun, 26 Apr 2009 08:52:30 +0300, Ciprian Dorin, Craciun wrote:

>     I liked very much your implementation for the compare function, it
> is very short and at the same time readable:
> 
>> def compare(a, b, comp=operator.eq):
>>     return (len(a) == len(b)) and all(comp(*t) for t in zip(a, b))
> 
>     But I have only one problem, it is suboptimal, in the sense that: *
>     it constructs two intermediary lists (the list comprehension and
> the zip call);

If you look closely, there is no list comprehension. The argument to 
all() is a generator expression, which does not construct an intermediary 
list.

However, you are right that zip produces a list, at least in Python 2.x. 
In Python 3 it produces a generator-like object.



>     * it evaluates all the elements, even if one is false at the
>     beginning;

No, all() uses short-cut evaluation. It will return as soon as it hits a 
False element.



>     So, could you overcome these problems?

In Python 2.4 or better, I can remove the intermediate list produced by 
zip with one line:

from itertools import izip as zip

(This may even work in 2.3, but I don't have 2.3 to test it.)


-- 
Steven



More information about the Python-list mailing list