Is there a nicer way to do this?

Discussion in 'Python' started by Stefan Arentz, Oct 4, 2007.

  1. Is there a better way to do the following?

    attributes = ['foo', 'bar']

    attributeNames = {}
    n = 1
    for attribute in attributes:
    attributeNames["AttributeName.%d" % n] = attribute
    n = n + 1

    It works, but I am wondering if there is a more pythonic way to
    do this.

    S.
     
    Stefan Arentz, Oct 4, 2007
    #1
    1. Advertising

  2. Hello,
    Stefan Arentz a écrit :
    > Is there a better way to do the following?
    >
    > attributes = ['foo', 'bar']
    >
    > attributeNames = {}
    > n = 1
    > for attribute in attributes:
    > attributeNames["AttributeName.%d" % n] = attribute
    > n = n + 1
    >
    > It works, but I am wondering if there is a more pythonic way to
    > do this.
    >
    > S.


    You could use enumerate() to number the items (careful it starts with 0):

    attributes = ['foo', 'bar']
    attributeNames = {}
    for n, attribute in enumerate(attributes):
    attributeNames["AttributeName.%d" % (n+1)] = attribute


    Then use a generator expression to feed the dict:

    attributes = ['foo', 'bar']
    attributeNames = dict(("AttributeName.%d" % (n+1), attribute)
    for n, attribute in enumerate(attributes))

    Hope this helps,

    --
    Amaury
     
    Amaury Forgeot d'Arc, Oct 4, 2007
    #2
    1. Advertising

  3. Stefan Arentz

    Tim Chase Guest

    > attributes = ['foo', 'bar']
    >
    > attributeNames = {}
    > n = 1
    > for attribute in attributes:
    > attributeNames["AttributeName.%d" % n] = attribute
    > n = n + 1
    >
    > It works, but I am wondering if there is a more pythonic way to
    > do this.


    "Better" may be subjective, but you could do something like

    attributes = ['foo', 'bar']
    attributeNames = dict(
    ("AttributeName.%d" % (i+1), attrib)
    for i, attrib
    in enumerate(attributes)
    )

    HTH,

    -tkc
     
    Tim Chase, Oct 4, 2007
    #3
  4. Stefan Arentz

    Casey Guest

    Not sure if this is really better or even more pythonic, but if you
    like one-liners that exercise the language:

    attributeNames = dict( [("AttributeName.%d" % (n+1), attribute) for
    n,attribute in enumerate(attributes)] )

    What this does is create a list (using a list comprehension and the
    enumerate function) of ("AttributeName.x", attribute) tuples which is
    then be used to initialize a dictionary.
     
    Casey, Oct 4, 2007
    #4
  5. Stefan Arentz

    Terry Reedy Guest

    "Stefan Arentz" <> wrote in message
    news:...
    |
    | Is there a better way to do the following?
    |
    | attributes = ['foo', 'bar']
    |
    | attributeNames = {}
    | n = 1
    | for attribute in attributes:
    | attributeNames["AttributeName.%d" % n] = attribute
    | n = n + 1
    |
    | It works, but I am wondering if there is a more pythonic way to
    | do this.

    Perhaps better is using enumerate:

    >>> attributeNames = {}
    >>> for n,attribute in enumerate(['foo', 'bar']):

    attributeNames["AttributeName.%d" % (n+1)] = attribute

    >>> attributeNames

    {'AttributeName.1': 'foo', 'AttributeName.2': 'bar'}

    However, mapping indexes to names should be more useful:

    >>> aNames = dict(enumerate(['foo', 'bar']))
    >>> aNames

    {0: 'foo', 1: 'bar'}


    Terry Jan Reedy
     
    Terry Reedy, Oct 4, 2007
    #5
  6. Stefan Arentz

    Casey Guest

    On Oct 4, 5:42 pm, Casey <> wrote:
    > Not sure if this is really better or even more pythonic, but if you
    > like one-liners that exercise the language:


    Hmm, I guess it WAS more pythonic, since three of us gave essentially
    identical responses in a 10-minute period. That being said, I'd
    recommend a good comment before the one-liner describing what the
    output dictionary is going to look like. Anyone who reads your code
    (including yourself, two weeks later) will thank you!
     
    Casey, Oct 4, 2007
    #6
  7. Stefan Arentz

    Paul Hankin Guest

    On Oct 4, 10:53 pm, "Terry Reedy" <> wrote:
    > However, mapping indexes to names should be more useful:
    >
    > >>> aNames = dict(enumerate(['foo', 'bar']))
    > >>> aNames

    >
    > {0: 'foo', 1: 'bar'}


    If you are right that a map from indices to name is best, there's no
    need for a dict: the original list already provides such a mapping.

    --
    Paul Hankin
     
    Paul Hankin, Oct 4, 2007
    #7
  8. On Thursday 04 October 2007 5:07:51 pm Stefan Arentz wrote:
    > Is there a better way to do the following?
    >
    > attributes = ['foo', 'bar']
    >
    > attributeNames = {}
    > n = 1
    > for attribute in attributes:
    > attributeNames["AttributeName.%d" % n] = attribute
    > n = n + 1
    >
    > It works, but I am wondering if there is a more pythonic way to
    > do this.
    >
    > S.


    just curious. why are you bothering in creating a dictionary? why not just
    iterate over attributes? why duplicate it and make it bigger? I personally
    think the dictionary is unnecessary but I may be wrong.

    anyhow, I keep getting "SyntaxError: Non-ASCII character '\xc2'..." on line 5.
    anyone know what this is? I couldn't run the script but from looking at it,
    it appears you're making some pointless keys when indexes may be better.

    --
    Best Regards
    Victor B. Gonzalez

    -----BEGIN PGP SIGNATURE-----
    Version: GnuPG v1.4.6 (GNU/Linux)

    iD8DBQBHBWaVIPvSgiLGOqARAr2yAJ98q55LiVQdHMGNdhYi4waRdcsaSQCfXhDs
    1fu16P1RZOHspfXsqzqtceE=
    =DIPF
    -----END PGP SIGNATURE-----
     
    Victor B. Gonzalez, Oct 4, 2007
    #8
  9. Stefan Arentz

    Terry Reedy Guest

    "Paul Hankin" <> wrote in message
    news:...
    | On Oct 4, 10:53 pm, "Terry Reedy" <> wrote:
    | > However, mapping indexes to names should be more useful:
    | >
    | > >>> aNames = dict(enumerate(['foo', 'bar']))
    | > >>> aNames
    | >
    | > {0: 'foo', 1: 'bar'}
    |
    | If you are right that a map from indices to name is best, there's no
    | need for a dict: the original list already provides such a mapping.

    Right. The dict should be reversed, mapping names to indexes, if there
    were a use.
     
    Terry Reedy, Oct 5, 2007
    #9
  10. Stefan Arentz <> writes:

    > Is there a better way to do the following?
    >
    > attributes = ['foo', 'bar']
    >
    > attributeNames = {}
    > n = 1
    > for attribute in attributes:
    > attributeNames["AttributeName.%d" % n] = attribute
    > n = n + 1
    >
    > It works, but I am wondering if there is a more pythonic way to
    > do this.


    Thank you all. The trick was enumerate(), which I did not know yet :)

    S.
     
    Stefan Arentz, Oct 5, 2007
    #10
  11. Stefan Arentz a écrit :
    > Is there a better way to do the following?
    >
    > attributes = ['foo', 'bar']
    >
    > attributeNames = {}
    > n = 1
    > for attribute in attributes:
    > attributeNames["AttributeName.%d" % n] = attribute
    > n = n + 1
    >
    > It works, but I am wondering if there is a more pythonic way to
    > do this.


    There is:

    attributeNames = dict(
    ("AttributeName.%d" % n, attr) \
    for n, attr in enumerate(attributes)
    )
     
    Bruno Desthuilliers, Oct 5, 2007
    #11
  12. Stefan Arentz

    Peter Otten Guest

    "SyntaxError: Non-ASCII character '\xc2'...", was Re: Is there anicer way to do this?

    Victor B. Gonzalez wrote:

    > anyhow, I keep getting "SyntaxError: Non-ASCII character '\xc2'..." on line 5.
    > anyone know what this is?


    I too had that problem with KNode. Leading space consists of NO-BREAK SPACE
    (unichr(160)) which translates to '\xc2\xa0' in UTF-8. As I don't see this
    problem here (using pan) I suspect it may be specific to KMail/KNode.

    Peter
     
    Peter Otten, Oct 5, 2007
    #12
  13. Re: "SyntaxError: Non-ASCII character '\xc2'...",

    On Friday 05 October 2007 3:33:43 am Peter Otten wrote:
    > Victor B. Gonzalez wrote:
    > > anyhow, I keep getting "SyntaxError: Non-ASCII character '\xc2'..." on
    > > line 5. anyone know what this is?

    >
    > I too had that problem with KNode. Leading space consists of NO-BREAK SPACE
    > (unichr(160)) which translates to '\xc2\xa0' in UTF-8. As I don't see this
    > problem here (using pan) I suspect it may be specific to KMail/KNode.
    >
    > Peter


    You're right, thank you for pointing that out. I am bad with almost anything
    like \this but stripping off the leading whitespace solved the issue. thank
    you for the heads up!

    --
    Best Regards
    Victor B. Gonzalez
     
    Victor B. Gonzalez, Oct 5, 2007
    #13
    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. Markus Rosenstihl

    Nicer way of strip and replace?

    Markus Rosenstihl, Oct 11, 2005, in forum: Python
    Replies:
    6
    Views:
    387
    Markus Rosenstihl
    Oct 12, 2005
  2. News123
    Replies:
    3
    Views:
    3,543
    Paul McGuire
    Jul 14, 2010
  3. S Kanakakorn
    Replies:
    3
    Views:
    388
    Jules
    Feb 9, 2007
  4. Remco Hh
    Replies:
    17
    Views:
    180
    Jesse Edelstein
    Nov 21, 2007
  5. Chris Smith

    Newbie Q - Nicer way to lc something?

    Chris Smith, Oct 1, 2003, in forum: Perl Misc
    Replies:
    16
    Views:
    173
    Chris Smith
    Oct 4, 2003
Loading...

Share This Page