Is there a nicer way to do this?

S

Stefan Arentz

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.
 
A

Amaury Forgeot d'Arc

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,
 
T

Tim Chase

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
 
C

Casey

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.
 
T

Terry Reedy

|
| 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
{'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
 
C

Casey

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!
 
V

Victor B. Gonzalez

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-----
 
T

Terry Reedy

| > 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.
 
S

Stefan Arentz

Stefan Arentz said:
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.
 
B

Bruno Desthuilliers

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)
)
 
P

Peter Otten

Victor said:
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
 
V

Victor B. Gonzalez

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!
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,999
Messages
2,570,244
Members
46,838
Latest member
KandiceChi

Latest Threads

Top