首页 > 解决方案 > 如何从多个不同类型的字符串列表中获取所需的值

问题描述

我正在构建一个计算 PT 可访问性的工具。我只需要更多的数据来开始量化过程,但一直在为下面的这个问题而苦苦挣扎。

我有这个脚本,它可以从 HERE API 获取公共交通旅行的断腿数据,这是代码的示例结果:

a = [' Walk 158m - 160s', ' Walk 267m - 267s', ' bus-246 ', ' bus-302 ', ' NA ', 'GTFS time > HERE API time', ' Walk 556m - 566s', 'train-Lilydale', ' Walk 52m - 52s', 'rail-109', ' Walk 0m - 0s']

我只想获取“m”和“s”前面的数字列表,以计算一次旅行的总步行时间和距离,我只能摆脱“m”、“s”和“NA”调整脚本和结果如下所示:

a = ['158 - 160', ' 267 - 267', ' bus-246 ', ' bus-302 ', 'GTFS time > HERE API time', ' 556 - 566', 'train-Lilydale', ' 52 - 52', 'rail-109', ' 0 - 0']

但即使我能得到我想要的(我做不到),调整现有脚本也有点难看。

关键是如何以这种形式获得输出:

Distance = [158, 267, 556, 52, 0]
Time = [160, 267, 556, 52, 0]

那么我可以计算它们的总和吗?

标签: pythonarrayspython-3.xstringsplit

解决方案


你可以使用一个非常简单的正则表达式:

import re

a = [' Walk 158m - 160s', ' Walk 267m - 267s', ' bus-246 ', ' bus-302 ', ' NA ', 'GTFS time > HERE API time', ' Walk 556m - 566s', 'train-Lilydale', ' Walk 52m - 52s', 'rail-109', ' Walk 0m - 0s']

def number_values(e):
    out = e
    numbers = re.findall(r'\d+', e)
    if len(numbers) == 2:
        out = '{0} - {1}'.format(*numbers)
    return out

[number_values(v) for v in a if v != ' NA ']
['158 - 160',
 '267 - 267',
 ' bus-246 ',
 ' bus-302 ',
 'GTFS time > HERE API time',
 '556 - 566',
 'train-Lilydale',
 '52 - 52',
 'rail-109',
 '0 - 0']

推荐阅读