471,310 Members | 1,471 Online
Bytes | Software Development & Data Engineering Community
Post +

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 471,310 software developers and data experts.

Is there a nicer way to do this?


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.
Oct 4 '07 #1
12 1336
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
Oct 4 '07 #2
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

Oct 4 '07 #3
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.

Oct 4 '07 #4

"Stefan Arentz" <st***********@gmail.comwrote in message
news:87************@keizer.soze.com...
|
| 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


Oct 4 '07 #5
On Oct 4, 5:42 pm, Casey <Casey...@gmail.comwrote:
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!

Oct 4 '07 #6
On Oct 4, 10:53 pm, "Terry Reedy" <tjre...@udel.eduwrote:
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

Oct 4 '07 #7
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 line5.
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)

iD8DBQBHBWaVIPvSgiLGOqARAr2yAJ98q55LiVQdHMGNdhYi4w aRdcsaSQCfXhDs
1fu16P1RZOHspfXsqzqtceE=
=DIPF
-----END PGP SIGNATURE-----

Oct 4 '07 #8

"Paul Hankin" <pa*********@gmail.comwrote in message
news:11*********************@57g2000hsv.googlegrou ps.com...
| On Oct 4, 10:53 pm, "Terry Reedy" <tjre...@udel.eduwrote:
| 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.

Oct 5 '07 #9
Stefan Arentz <st***********@gmail.comwrites:
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.
Oct 5 '07 #10
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)
)

Oct 5 '07 #11
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
Oct 5 '07 #12
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
Oct 5 '07 #13

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

4 posts views Thread by James | last post: by
5 posts views Thread by Scott D | last post: by
2 posts views Thread by Nick | last post: by
2 posts views Thread by Alexander Ross | last post: by
reply views Thread by Michele Simionato | last post: by
6 posts views Thread by Markus Rosenstihl | last post: by
6 posts views Thread by Ivan Weiss | last post: by
reply views Thread by Graeme Hinchliffe | last post: by
1 post views Thread by tomasio | last post: by
reply views Thread by rosydwin | last post: by

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.