Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Is there something similar to list comprehension in dict?

10 views
Skip to first unread message

Peng Yu

unread,
Nov 19, 2009, 10:18:04 PM11/19/09
to pytho...@python.org
I'm wondering if there is something similar to list comprehension for
dict (please see the example code below).


d = dict(one=1, two=2)
print d

def fun(d):#Is there a way similar to list comprehension to change the
argument d so that d is changed?
d=dict(three=3)

fun(d)
print d

def fun1(d):
d['one']=-1

fun1(d)
print d


L = [1, 2]
print L

def fun2(L):#this doesn't have any effect on the argument L
L=[]

fun2(L)
print L#[1, 2]

def fun3(L):# argument L is changed
L[:]=[1, 2, 3]

fun3(L)
print L#[1, 2, 3]

Michele Simionato

unread,
Nov 20, 2009, 3:19:43 AM11/20/09
to
On Nov 20, 4:18 am, Peng Yu <pengyu...@gmail.com> wrote:
> I'm wondering if there is something similar to list comprehension for
> dict

Yes, but only in Python 3:

>>> {(i, x) for i, x in enumerate('abc')}
{(0, 'a'), (1, 'b'), (2, 'c')}

Stefan Behnel

unread,
Nov 20, 2009, 3:24:31 AM11/20/09
to
Peng Yu, 20.11.2009 04:18:

> I'm wondering if there is something similar to list comprehension for
> dict (please see the example code below).

A list comprehension is an expression that produces a list, e.g.

[ i**2 for i in range(10) ]

Your example below uses a slice assignment.


> def fun(d):#Is there a way similar to list comprehension to change the
> argument d so that d is changed?
> d=dict(three=3)

> [...]


> def fun3(L):# argument L is changed
> L[:]=[1, 2, 3]

You can use d.update(...)

It accepts both another dict as well as a generator expression that
produces item tuples, e.g.

d.update( (i, i**2) for i in range(10) )

Does that help?

Stefan

Stefan Behnel

unread,
Nov 20, 2009, 3:26:21 AM11/20/09
to
Stefan Behnel, 20.11.2009 09:24:

> You can use d.update(...)
>
> It accepts both another dict as well as a generator expression that
> produces item tuples, e.g.
>
> d.update( (i, i**2) for i in range(10) )

This also works, BTW:

>>> d = {}
>>> d.update(value=5)
>>> d
{'value': 5}

Stefan

Patrick Sabin

unread,
Nov 20, 2009, 4:21:40 AM11/20/09
to Peng Yu, pytho...@python.org
Peng Yu wrote:
> I'm wondering if there is something similar to list comprehension for
> dict (please see the example code below).

Do you mean something like this:

>>> {i:i+1 for i in [1,2,3,4]}
{1: 2, 2: 3, 3: 4, 4: 5}

This works in python3, but not in python2

- Patrick

Paul Rudin

unread,
Nov 20, 2009, 4:29:47 AM11/20/09
to
Patrick Sabin <patrick....@gmail.com> writes:

Of course in python 2 you can do:

>>> dict((i, i+1) for i in [1,2,3,4])

Terry Reedy

unread,
Nov 20, 2009, 4:32:03 AM11/20/09
to pytho...@python.org
Peng Yu wrote:
> I'm wondering if there is something similar to list comprehension for
> dict (please see the example code below).

Python 3 has list, set, and dict comprehensions.
Don't know about 2.6/7

DreiJane

unread,
Nov 20, 2009, 6:08:01 AM11/20/09
to
NB: I wondered about about dict(one=1, two=2) - why not d = {one:1,
two:2} ? Since you do not write L=list((1, 2)) either. These composed
objects as basic building blocks make Python code so dense and
beautiful, thus using "{}" means embracing the language's concept.

Diez B. Roggisch

unread,
Nov 20, 2009, 9:03:35 AM11/20/09
to
DreiJane schrieb:

> NB: I wondered about about dict(one=1, two=2) - why not d = {one:1,
> two:2} ? Since you do not write L=list((1, 2)) either. These composed

because it's not working.

>>> {one : 1}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'one' is not defined


Yes, that looks nitpicky, but that is exactly the reason one often
prefers the dict(...)-variant. Because it uses python keywords, it
spares you to type quotes around all the keys. Which IMHO is more aesthetic.


> objects as basic building blocks make Python code so dense and
> beautiful, thus using "{}" means embracing the language's concept.

The collection-literals are a great thing, no doubt. But these
alternatives are not against any concept.

Diez

Andre Engels

unread,
Nov 20, 2009, 6:41:10 AM11/20/09
to Peng Yu, pytho...@python.org
On Fri, Nov 20, 2009 at 4:18 AM, Peng Yu <peng...@gmail.com> wrote:
> I'm wondering if there is something similar to list comprehension for
> dict (please see the example code below).
>
>
> d = dict(one=1, two=2)
> print d
>
> def fun(d):#Is there a way similar to list comprehension to change the
> argument d so that d is changed?
>  d=dict(three=3)
>
> fun(d)
> print d
>
> def fun1(d):
>  d['one']=-1
>
> fun1(d)
> print d
>
>
> L = [1, 2]
> print L
>
> def fun2(L):#this doesn't have any effect on the argument L
>  L=[]
>
> fun2(L)
> print L#[1, 2]
>
> def fun3(L):# argument L is changed
>  L[:]=[1, 2, 3]
>
> fun3(L)
> print L#[1, 2, 3]
> --
> http://mail.python.org/mailman/listinfo/python-list
>

def fun(d):
d.clear()
d[three] = 3


--
André Engels, andre...@gmail.com

Tim Golden

unread,
Nov 20, 2009, 6:47:26 AM11/20/09
to pytho...@python.org

Although the 2.x syntax is hardly onerous:

dict ((i+5, x) for i, x in enumerate ('abc'))


-- obviously without something like the i+5, the example
equates to dict (enumerate ('abc'))

:)

TJG

Dave Angel

unread,
Nov 20, 2009, 6:45:27 AM11/20/09
to Peng Yu, pytho...@python.org
Peng Yu wrote:
> I'm wondering if there is something similar to list comprehension for
> dict (please see the example code below).
>
>
> d = dict(one=1, two=2)
> print d
>
> def fun(d):#Is there a way similar to list comprehension to change the
> argument d so that d is changed?
> d=dict(three=3)
>
> fun(d)
> print d
>
> def fun1(d):
> d['one']=-1
>
> fun1(d)
> print d
>
>
> L = [1, 2]
> print L
>
> def fun2(L):#this doesn't have any effect on the argument L
> L=[]
>
> fun2(L)
> print L#[1, 2]
>
> def fun3(L):# argument L is changed
> L[:]=[1, 2, 3]
>
> fun3(L)
> print L#[1, 2, 3]
>
>
You confused me by calling it a list comprehension. All you're using in
fun3() is a slice. Using a slice, you can give a new set of values to
an existing list.

For a dictionary, it's just a bit trickier. You need two steps in the
most general case.

def fun4(d):
d.clear() #clear out existing entries
d.update(new_dict) #copy in new key:val pairs from a
different dictionary

This function will modify the caller's dictionary, completely replacing
the contents.

DaveA

Simon Brunning

unread,
Nov 20, 2009, 7:00:53 AM11/20/09
to Michele Simionato, pytho...@python.org
2009/11/20 Michele Simionato <michele....@gmail.com>:

> Yes, but only in Python 3:
>
>>>> {(i, x) for i, x in enumerate('abc')}
> {(0, 'a'), (1, 'b'), (2, 'c')}

In Python 2.x, you can do:

>>> dict((i, x) for i, x in enumerate('abc'))
{0: 'a', 1: 'b', 2: 'c'}

(Works in 2.5 - I can't remember when generator expressions were introduced.)

--
Cheers,
Simon B.

Steven D'Aprano

unread,
Nov 20, 2009, 3:37:22 PM11/20/09
to
On Fri, 20 Nov 2009 03:08:01 -0800, DreiJane wrote:

> NB: I wondered about about dict(one=1, two=2) - why not d = {one:1,
> two:2} ?

Because it doesn't work unless you have defined names one and two.

dict(one=1, two=2) uses keyword arguments, namely one and two. This is
the same standard mechanism by which you call functions with keyword
arguments:

myfunc(widget=x, width=5, name='fred', flag=True)


The dict literal syntax requires names one and two to already exist,
otherwise you have to quote them to make them strings:

d = {'one': 1, 'two': 2}

> Since you do not write L=list((1, 2)) either.

But you certainly can. It would be wasteful, since first it constructs a
tuple (1, 2), then it creates a list from that tuple.


> These composed
> objects as basic building blocks make Python code so dense and
> beautiful, thus using "{}" means embracing the language's concept.

I don't understand this sentence.

--
Steven

0 new messages