Search code examples
pythonlistdictionaryopenstreetmapopenrouteservice

Decoding list containing dictionaries


I need to get certain values out of a list of dictionaries, which looks like that and is assigned to the variable 'segment_values':

[{'distance': 114.6,
  'duration': 20.6,
  'instruction': 'Head north',
  'name': '-',
  'type': 11,
  'way_points': [0, 5]},
 {'distance': 288.1,
  'duration': 28.5,
  'instruction': 'Turn right onto Knaufstraße',
  'name': 'Knaufstraße',
  'type': 1,
  'way_points': [5, 17]},
 {'distance': 3626.0,
  'duration': 273.0,
  'instruction': 'Turn slight right onto B320',
  'name': 'B320',
  'type': 5,
  'way_points': [17, 115]},
 {'distance': 54983.9,
  'duration': 2679.3,
  'instruction': 'Keep right onto Ennstal-Bundesstraße, B320',
  'name': 'Ennstal-Bundesstraße, B320',
  'type': 13,
  'way_points': [115, 675]},
 {'distance': 11065.1,
  'duration': 531.1,
  'instruction': 'Keep left onto Pyhrn Autobahn, A9',
  'name': 'Pyhrn Autobahn, A9',
  'type': 12,
  'way_points': [675, 780]},
 {'distance': 800.7,
  'duration': 64.1,
  'instruction': 'Keep right',
  'name': '-',
  'type': 13,
  'way_points': [780, 804]},
 {'distance': 49.6,
  'duration': 4.0,
  'instruction': 'Keep left',
  'name': '-',
  'type': 12,
  'way_points': [804, 807]},
 {'distance': 102057.2,
  'duration': 4915.0,
  'instruction': 'Keep right',
  'name': '-',
  'type': 13,
  'way_points': [807, 2104]},
 {'distance': 56143.4,
  'duration': 2784.5,
  'instruction': 'Keep left onto S6',
  'name': 'S6',
  'type': 12,
  'way_points': [2104, 2524]},
 {'distance': 7580.6,
  'duration': 389.8,
  'instruction': 'Keep left',
  'name': '-',
  'type': 12,
  'way_points': [2524, 2641]},
 {'distance': 789.0,
  'duration': 63.1,
  'instruction': 'Keep right',
  'name': '-',
  'type': 13,
  'way_points': [2641, 2663]},
 {'distance': 815.9,
  'duration': 65.3,
  'instruction': 'Keep left',
  'name': '-',
  'type': 12,
  'way_points': [2663, 2684]},
 {'distance': 682.9,
  'duration': 54.6,
  'instruction': 'Turn left onto Heinrich-Drimmel-Platz',
  'name': 'Heinrich-Drimmel-Platz',
  'type': 0,
  'way_points': [2684, 2711]},
 {'distance': 988.1,
  'duration': 79.0,
  'instruction': 'Turn left onto Arsenalstraße',
  'name': 'Arsenalstraße',
  'type': 0,
  'way_points': [2711, 2723]},
 {'distance': 11.7,
  'duration': 2.1,
  'instruction': 'Turn left',
  'name': '-',
  'type': 0,
  'way_points': [2723, 2725]},
 {'distance': 0.0,
  'duration': 0.0,
  'instruction': 'Arrive at your destination, on the left',
  'name': '-',
  'type': 10,
  'way_points': [2725, 2725]}]

I need to get the duration values and the waypoint values out of that code segment.

For the duration I tried:

segment_values= data['features'][0]['properties']['segments'][0]['steps'] #gets me the above code
print(segment_values[0:]['duration']) 

Shouldn't this print me all dictionaries, and the values at duration in each of them?

I also tried this:

duration = data['features'][0]['properties']['segments'][0]['steps'][0:]['duration']
print(duration)

Both tries give me "TypeError: list indices must be integers or slices, not str "

Where am I going wrong?


Solution

  • Your data is a list of dictionaries.

    For this reason you need to cycle through its content in order to access data. Please try this print statement to look at the data more closely:

    for item in data_list:
        print(item)
    

    In order to access duration per each item you can use similar code:

    for item in data_list:
        print(item['duration'])
    

    You can also use list comprehension to achieve the same result:

    duration = [item['duration'] for item in data_list]
    

    List comprehension is a Pythonic way to obtain the same result, you can read more about it here.

    The same principle can be applied twice if a key in your data contains a list or another iterable, here's another example:

    for item in data:
        print("\nPrinting waypoints for name: " + item['name'])
        for way_point in item['way_points']:
            print(way_point)