包含字典的解码列表

问题描述

我需要从字典列表中获取某些值,它看起来像这样并分配给变量“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,'type': 13,'way_points': [115,675]},{'distance': 11065.1,'duration': 531.1,'instruction': 'Keep left onto Pyhrn Autobahn,A9','name': 'Pyhrn Autobahn,'type': 12,'way_points': [675,780]},{'distance': 800.7,'duration': 64.1,'instruction': 'Keep right','way_points': [780,804]},{'distance': 49.6,'duration': 4.0,'instruction': 'Keep left','way_points': [804,807]},{'distance': 102057.2,'duration': 4915.0,'way_points': [807,2104]},{'distance': 56143.4,'duration': 2784.5,'instruction': 'Keep left onto S6','name': 'S6','way_points': [2104,2524]},{'distance': 7580.6,'duration': 389.8,'way_points': [2524,2641]},{'distance': 789.0,'duration': 63.1,'way_points': [2641,2663]},{'distance': 815.9,'duration': 65.3,'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','way_points': [2711,2723]},{'distance': 11.7,'duration': 2.1,'instruction': 'Turn left','way_points': [2723,2725]},{'distance': 0.0,'duration': 0.0,'instruction': 'Arrive at your destination,on the left','type': 10,'way_points': [2725,2725]}]

我需要从该代码段中获取持续时间值和航路点值。

在我尝试的这段时间里:

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

这不应该向我打印所有字典,以及每个字典中的持续时间值吗?

我也试过这个:

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

两次尝试都给我“类型错误:列表索引必须是整数或切片,而不是 str "

我哪里出错了?

解决方法

您的数据是字典列表。

因此,您需要循环浏览其内容才能访问数据。 请尝试使用此打印语句更仔细地查看数据:

for item in data_list:
    print(item)

为了访问每个项目的持续时间,您可以使用类似的代码:

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

您也可以使用列表理解来达到相同的结果:

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

列表推导是一种获得相同结果的 Pythonic 方式,您可以阅读有关它的更多信息 here

如果数据中的一个键包含一个列表或另一个可迭代对象,同样的原则可以应用两次,这是另一个例子:

for item in data:
    print("\nPrinting waypoints for name: " + item['name'])
    for way_point in item['way_points']:
        print(way_point)
,
duration = [x['duration'] for x in segment_values]
waypoints =[x['way_points'] for x in segment_values]
,

您可能会考虑使用更高级的包装器,例如 public void diplayFragmentB() { Fragment mainFragment = getSupportFragmentManager().findFragmentById(R.id.fragment_main); getSupportFragmentManager().beginTransaction() .hide(mainFragment) .commit(); FragmentB fragmentB = new FragmentB(); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.replace(R.id.fragment_container,fragmentB); transaction.commit(); transaction.addToBackStack(null); } ,它可以让您这样做

@Override
public void onBackPressed() {
    if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
        super.onBackPressed();

        Fragment mainFragment = getSupportFragmentManager().findFragmentById(R.id.fragment_main);
        getSupportFragmentManager().beginTransaction()
                .show(mainFragment)
                .commit();
    } else {
        finish();
    }
}
,

另一个工具是 glom,它为这样的逻辑提供帮助程序 (pip install glom)。

>>> from glom import glom
>>> from pprint import pprint
>>> data = <your data>
>>> pprint(glom(data,[{'wp': 'way_points','dist': 'distance'}]))
[{'dist': 114.6,'wp': [0,5]},{'dist': 288.1,'wp': [5,17]},{'dist': 3626.0,'wp': [17,115]},{'dist': 54983.9,'wp': [115,675]},{'dist': 11065.1,'wp': [675,780]},{'dist': 800.7,'wp': [780,804]},{'dist': 49.6,'wp': [804,807]},{'dist': 102057.2,'wp': [807,2104]},{'dist': 56143.4,'wp': [2104,2524]},{'dist': 7580.6,'wp': [2524,2641]},{'dist': 789.0,'wp': [2641,2663]},{'dist': 815.9,'wp': [2663,2684]},{'dist': 682.9,'wp': [2684,2711]},{'dist': 988.1,'wp': [2711,2723]},{'dist': 11.7,'wp': [2723,2725]},{'dist': 0.0,'wp': [2725,2725]}]

您可以从文档中了解其他案例的工作方式: https://glom.readthedocs.io/en/latest/faq.html#how-does-glom-work

def glom(target,spec):

    # if the spec is a string or a Path,perform a deep-get on the target
    if isinstance(spec,(basestring,Path)):
        return _get_path(target,spec)

    # if the spec is callable,call it on the target
    elif callable(spec):
        return spec(target)

    # if the spec is a dict,assign the result of
    # the glom on the right to the field key on the left
    elif isinstance(spec,dict):
        ret = {}
        for field,subspec in spec.items():
           ret[field] = glom(target,subspec)
        return ret

    # if the spec is a list,run the spec inside the list on every
    # element in the list and return the new list
    elif isinstance(spec,list):
        subspec = spec[0]
        iterator = _get_iterator(target)
        return [glom(t,subspec) for t in iterator]

    # if the spec is a tuple of specs,chain the specs by running the
    # first spec on the target,then running the second spec on the
    # result of the first,and so on.
    elif isinstance(spec,tuple):
        res = target
        for subspec in spec:
            res = glom(res,subspec)
        return res
    else:
        raise TypeError('expected one of the above types')