Is there something similar to list comprehension in dict?

Discussion in 'Python' started by Peng Yu, Nov 20, 2009.

  1. Peng Yu

    Peng Yu Guest

    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]
     
    Peng Yu, Nov 20, 2009
    #1
    1. Advertising

  2. On Nov 20, 4:18 am, Peng Yu <> 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')}
     
    Michele Simionato, Nov 20, 2009
    #2
    1. Advertising

  3. 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, Nov 20, 2009
    #3
  4. 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
     
    Stefan Behnel, Nov 20, 2009
    #4
  5. Peng Yu

    DreiJane Guest

    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.
     
    DreiJane, Nov 20, 2009
    #5
  6. Peng Yu

    Tim Golden Guest

    Michele Simionato wrote:
    > On Nov 20, 4:18 am, Peng Yu <> 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')}


    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
     
    Tim Golden, Nov 20, 2009
    #6
  7. 2009/11/20 Michele Simionato <>:
    > 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.
     
    Simon Brunning, Nov 20, 2009
    #7
  8. 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
     
    Diez B. Roggisch, Nov 20, 2009
    #8
  9. 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
     
    Steven D'Aprano, Nov 20, 2009
    #9
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Mike42
    Replies:
    21
    Views:
    17,394
    Chris Uppal
    Nov 14, 2005
  2. Bo Peng
    Replies:
    31
    Views:
    822
    Ron Adam
    Jun 30, 2005
  3. Drew
    Replies:
    19
    Views:
    1,365
    Duncan Booth
    Mar 15, 2007
  4. Vedran Furac(
    Replies:
    4
    Views:
    347
    Marc 'BlackJack' Rintsch
    Dec 19, 2008
  5. Patrick Sabin
    Replies:
    1
    Views:
    325
    Paul Rudin
    Nov 20, 2009
Loading...

Share This Page