Accessing elements of python dictionary by index

2018-12-31 20:08发布

问题:

Consider a dict like

mydict = {
  \'Apple\': {\'American\':\'16\', \'Mexican\':10, \'Chinese\':5},
  \'Grapes\':{\'Arabian\':\'25\',\'Indian\':\'20\'} }

How do I access for instance a particular element of this dictionary ? for instance I would like to print first element after some formatting the first element of Apple which in our case is \'American\' only ?

Additional information The above data structure was created by parsing an input file in a python function. Once created however it remains the same for that run.

I am using this data structure in my function.

So if the file changes, the next time this application is run the contents of file are different and hence the contents of this data structure will be different but the format would be same. So you see I in my function I don\'t know that the first element in Apple is \'American\' or anything else so I can\'t directly use \'American\' as a key

回答1:

Given that it is a dictionary you access it by using the keys. Getting the dictionary stored under \"Apple\", do the following:

>>> mydict[\"Apple\"]
{\'American\': \'16\', \'Mexican\': 10, \'Chinese\': 5}

And getting how many of them are American (16), do like this:

>>> mydict[\"Apple\"][\"American\"]
\'16\'


回答2:

If the questions is, if I know that I have a dict of dicts that contains \'Apple\' as a fruit and \'American\' as a type of apple, I would use:

myDict = {\'Apple\': {\'American\':\'16\', \'Mexican\':10, \'Chinese\':5},
          \'Grapes\':{\'Arabian\':\'25\',\'Indian\':\'20\'} }


print myDict[\'Apple\'][\'American\']

as others suggested. If instead the questions is, you don\'t know whether \'Apple\' as a fruit and \'American\' as a type of \'Apple\' exist when you read an arbitrary file into your dict of dict data structure, you could do something like:

print [ftype[\'American\'] for f,ftype in myDict.iteritems() if f == \'Apple\' and \'American\' in ftype]

or better yet so you don\'t unnecessarily iterate over the entire dict of dicts if you know that only Apple has the type American:

if \'Apple\' in myDict:
    if \'American\' in myDict[\'Apple\']:
        print myDict[\'Apple\'][\'American\']

In all of these cases it doesn\'t matter what order the dictionaries actually store the entries. If you are really concerned about the order, then you might consider using an OrderedDict:

http://docs.python.org/dev/library/collections.html#collections.OrderedDict



回答3:

As I noticed your description, you just know that your parser will give you a dictionary that its values are dictionary too like this:

sampleDict = {
              \"key1\": {\"key10\": \"value10\", \"key11\": \"value11\"},
              \"key2\": {\"key20\": \"value20\", \"key21\": \"value21\"}
              }

So you have to iterate over your parent dictionary. If you want to print out or access all first dictionary keys in sampleDict.values() list, you may use something like this:

for key, value in sampleDict.items():
    print value.keys()[0]

If you want to just access first key of the first item in sampleDict.values(), this may be useful:

print sampleDict.values()[0].keys()[0]

If you use the example you gave in the question, I mean:

sampleDict = {
              \'Apple\': {\'American\':\'16\', \'Mexican\':10, \'Chinese\':5},
              \'Grapes\':{\'Arabian\':\'25\',\'Indian\':\'20\'}
              }

The output for the first code is:

American
Indian

And the output for the second code is:

American


回答4:

You can use dict[\'Apple\'].keys()[0] to get the first key in the Apple dictionary, but there\'s no guarantee that it will be American. The order of keys in a dictionary can change depending on the contents of the dictionary and the order the keys were added.



回答5:

As a bonus, I\'d like to offer kind of a different solution to your issue. You seem to be dealing with nested dictionaries, which is usually tedious, especially when you have to check for existence of an inner key.

There are some interesting libraries regarding this on pypi, here is a quick search for you.

In your specific case, dict_digger seems suited.

>>> import dict_digger
>>> d = {
  \'Apple\': {\'American\':\'16\', \'Mexican\':10, \'Chinese\':5},
  \'Grapes\':{\'Arabian\':\'25\',\'Indian\':\'20\'} 
}

>>> print(dict_digger.dig(d, \'Apple\',\'American\'))
16
>>> print(dict_digger.dig(d, \'Grapes\',\'American\'))
None


回答6:

You can\'t rely on order on dictionaries. But you may try this:

dict[\'Apple\'].items()[0][0]

If you want the order to be preserved you may want to use this: http://www.python.org/dev/peps/pep-0372/#ordered-dict-api



回答7:

Simple Example to understand how to access elements in the dictionary:-

Create a Dictionary

d = {\'dog\' : \'bark\', \'cat\' : \'meow\' } 
print(d.get(\'cat\'))
print(d.get(\'lion\'))
print(d.get(\'lion\', \'Not in the dictionary\'))
print(d.get(\'lion\', \'NA\'))
print(d.get(\'dog\', \'NA\'))

Explore more about Python Dictionaries and learn interactively here...