alternative to zip(*map(f, lst))?
Alex Martelli
aleax at aleax.it
Tue Jan 22 21:20:00 CET 2002
Huaiyu Zhu wrote:
...
>>>> def f(x): return x, x*3
> ...
>>>> a, b = zip(*map(f, range(2))); print a, b
> (0, 1) (0, 3)
>>>> a, b = zip(*map(f, range(1))); print a, b
> (0,) (0,)
>>>> a, b = zip(*map(f, range(0))); print a, b
> Traceback (most recent call last):
> File "<stdin>", line 1, in ?
> TypeError: zip() requires at least one sequence
>
> Is is possible to get () () in the last case? Thanks.
Possible, and even quite easy, although not necessarily
good programming practice:
a, b = n and zip(*map(f, range(n))) or 2*[()]
more generally, for an arbitrary sequence X and f
returning an N-tuple for an arbitrary given N,
X and zip(*map(f, X)) or N*[()]
However, as I mentioned, I don't think that building such
"deep" (as in "complicated") inline expressions is best
programming practice. You don't get a prize for squishing
everything into one expression. I would code, NOT
def hz(f, X, N): return X and zip(*map(f, X)) or N*[()]
but rather:
def am(f, X, N):
if X: return zip(*map(f, X))
else: return N*[()]
(assuming for the sake of argument that I did want to
use the zip(*map trick at all, of course:-).
Alex
More information about the Python-list
mailing list