On Aug 30, 3:24 am, Dan Fichter <daniel.fich...@gmail.com> wrote:
> [...]
> Take a dictionary of defaults and a user-supplied dictionary and return a
> new dictionary that combines them, with the user's entries winning when both
> dictionaries have the same key.
>
> [Clojure]
>
> (defn foo [defaults user]
>   (merge defaults user))
>
> [Python]
> [...]
>
> def foo(defaults, user):
>   d = {}
>   for k, v in defaults.items() + user.items():
>     d[k] = v
>   return d

You don't need to explicitly build up a new list; using the dictionary
constructor will result in a fairer comparison. Clojure is still a
little nicer for having a built-in function.

def foo(defaults, user):
    return dict(defaults.items() + user.items())

> [...]
> Define z as the lazy Cartesian product of two collections, x and y.
>
> [Clojure]
>
> (def z (for [i x j y] [i j]))
>
> [Python]
>
> def foo(x, y):
>   for i in x:
>     for j in y:
>       yield i, j
> z = foo(x, y)
>
> import itertools
> z = itertools.product(x, y) # new in Python 2.6
>
> To get a lazy sequence in Python, you need to write a generator-function and
> then call it to get a generator, or use itertools.  

That's not quite right; you could also use a generator expression. The
Clojure idiom that you made use of is directly available in Python:

((i, j) for i in x for j in y)

gives you a lazy sequence of entries in the Cartesian product of x and
y.

Best,
James

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to