Dict lookup shortcut?

Bengt Richter bokr at oz.net
Tue Oct 12 20:54:32 EDT 2004


On Tue, 12 Oct 2004 12:39:23 +0100, "M. Clift" <noone at here.com> wrote:

>Hi All,
>
>Can someone tell me is there a shorthand version to do this?
>
First question is why you want to do "this" -- and what "this" really is ;-)

>l1 = ['n1', 'n3', 'n1'...'n23'...etc...]
>
Where does that list of names come from?

>Names = {'n1':'Cuthbert','n2' :'Grub','n3' :'Dibble' etc...}
>
>for name in l1:
>    print Names[name],
>
>Rather than listing all the name+numbers keys in the dictionary can these
>keys be shortened somehow into one key and a range?
>


 >>> Names = dict([('n%s'%(i+1), name) for i,name in enumerate('Cuthbert Grub Dibble'.split())])
 >>> Names
 {'n1': 'Cuthbert', 'n2': 'Grub', 'n3': 'Dibble'}
 >>> for key in Names: print Names[key],
 ...
 Cuthbert Grub Dibble

I doubt that's what you really wanted to do, but who knows ;-)

BTW, in general, you can't depend on the order of keys gotten from a dictionary.

So if the dictionary pre-existed with those systematic sortable keys, you could
get them without knowing how many keys there were, and sort them instead of making
a manual list. E.g.,

 >>> keys = Names.keys()
 >>> keys.sort()
 >>> for key in keys: print Names[key],
 ...
 Cuthbert Grub Dibble

OTOH, if you are storing names in numerical order and want to retrieve them by
a key that represents their numerical position in the order, why not just use
a list and index it by numbers? E.g.

 >>> NameList = 'Cuthbert Grub Dibble'.split()
 >>> NameList
 ['Cuthbert', 'Grub', 'Dibble']
 >>> NameList[0]
 'Cuthbert'
 >>> NameList[2]
 'Dibble'

Plus, you don't have to bother with indices or sortable names at all
if you want to process them in order:

 >>> for name in NameList: print name,
 ...
 Cuthbert Grub Dibble

And if you do want an associated number, there's enumerate:

 >>> for i,name in enumerate(NameList): print 'Name #%2s: "%s"'%(i+1,name)
 ...
 Name # 1: "Cuthbert"
 Name # 2: "Grub"
 Name # 3: "Dibble"

Notice that I added 1 to i in order to print starting with # 1, since enumerate starts with 0 ;-)

Regards,
Bengt Richter



More information about the Python-list mailing list