Costantin
Costantin

Reputation: 2656

Access data into list of dictionaries python

I have a list of dictionaries, with some nested dictionaries inside:

[{'id': '67569006',
'kind': 'analytics#accountSummary',
'name': 'Adopt-a-Hydrant',
'webProperties': [{'id': 'UA-62536006-1',
                 'internalWebPropertyId': '102299473',
                 'kind': 'analytics#webPropertySummary',
                 'level': 'STANDARD',
                 'name': 'Adopt-a-Hydrant',
                 'profiles': [{'id': '107292146',
                               'kind': 'analytics#profileSummary',
                               'name': 'Adopt a Hydrant view1',
                               'type': 'WEB'},
                              {'id': '1372982608',
                               'kind': 'analytics#profileSummary',
                               'name': 'Unfiltered view',
                               'type': 'WEB'}],
                 'websiteUrl': 'https://example1.com/'}]},
{'id': '44824959',
'kind': 'analytics#accountSummary',
'name': 'Adorn',
'webProperties': [{'id': 'UA-62536006-1',
                 'internalWebPropertyId': '75233390',
                 'kind': 'analytics#webPropertySummary',
                 'level': 'STANDARD',
                 'name': 'Website 2',
                 'profiles': [{'id': '77736192',
                               'kind': 'analytics#profileSummary',
                               'name': 'All Web Site Data',
                               'type': 'WEB'}],
                 'websiteUrl': 'http://www.example2.com'}]},
]

I'm trying to print the site name, url & view, if the site have 2 or more views print them all, and this is where it gets tricky.

So far I've tried:

all_properties = [The list above]
for single_property in all_properties:
    single_propery_name=single_property['name']
    view_name=single_property['webProperties'][0]['profiles'][0]['name']
    view_id=single_property['webProperties'][0]['profiles'][0]['id']
    print(single_propery_name, view_name, view_id)

This almost work, but it prints only the first view profile>name of each property, however some properties have more than one view and I need also these views to get print out.

The output now is:

Adopt-a-Hydrant Adopt a Hydrant view1 107292146
Website 2 All Web Site Data 77736192

So it's skipping the second view of the first property. I tried nesting a sub for loop but I can't get it to work, the final output should be:

Adopt-a-Hydrant Adopt a Hydrant view1 107292146
Adopt-a-Hydrant Unfiltered View 1372982608
Website 2 All Web Site Data 77736192

Any ideas on how to get that?

Upvotes: 2

Views: 64

Answers (3)

Neil
Neil

Reputation: 14313

If you're getting really confused, don't be afraid to just make variable.

Look at how much more readable this is:

for item in data:
    webProperties = item['webProperties'][0]
    print("Name: " + webProperties["name"])
    print("URL: " + webProperties["websiteUrl"])
    print("PRINTING VIEWS\n")
    print("----------------------------")
    views = webProperties['profiles']
    for view in views:
        print("ID: " + view['id'])
        print("Kind: " + view['kind'])
        print("Name: " + view['name'])
        print("Type: " + view['type'])
    print("----------------------------")
    print("\n\n\n")

Data is defined as the information you gave us:

data = [{'id': '67569006',
'kind': 'analytics#accountSummary',
'name': 'Adopt-a-Hydrant',
'webProperties': [{'id': 'UA-62536006-1',
                 'internalWebPropertyId': '102299473',
                 'kind': 'analytics#webPropertySummary',
                 'level': 'STANDARD',
                 'name': 'Adopt-a-Hydrant',
                 'profiles': [{'id': '107292146',
                               'kind': 'analytics#profileSummary',
                               'name': 'Adopt a Hydrant view1',
                               'type': 'WEB'},
                              {'id': '1372982608',
                               'kind': 'analytics#profileSummary',
                               'name': 'Unfiltered view',
                               'type': 'WEB'}],
                 'websiteUrl': 'https://example1.com/'}]},
{'id': '44824959',
'kind': 'analytics#accountSummary',
'name': 'Adorn',
'webProperties': [{'id': 'UA-62536006-1',
                 'internalWebPropertyId': '75233390',
                 'kind': 'analytics#webPropertySummary',
                 'level': 'STANDARD',
                 'name': 'Website 2',
                 'profiles': [{'id': '77736192',
                               'kind': 'analytics#profileSummary',
                               'name': 'All Web Site Data',
                               'type': 'WEB'}],
                 'websiteUrl': 'http://www.example2.com'}]},
]

Upvotes: 0

20-roso
20-roso

Reputation: 383

Just another proposition with oneline loops:

for single_property in data:
   single_propery_name=single_property['name']
   view_name = [i['name'] for i in single_property['webProperties'][0]['profiles']]
   view_id = [i['id'] for i in single_property['webProperties'][0]['profiles']]
   print(single_propery_name, view_name, view_id)

The point is that you will have to loop inside the lists. You could also make objects, if you think your Data would be more manageable.

Upvotes: 0

jtmingus
jtmingus

Reputation: 834

You need to iterate through the profiles list for each single_property:

for single_property in all_properties:
    single_property_name = single_property['name']
    for profile in single_property['webProperties'][0]['profiles']:
            view_name = profile['name']
            view_id = profile['id']
            print(single_property_name, view_name, view_id)

It would probably help if you read a little in the python docs about lists and how to iterate through them

Upvotes: 1

Related Questions