Python 使用元组收集数据

Python 使用元组收集数据前面介绍了两种常用的处理元组的技术,并简单介绍了处理复杂结构的第三种方法。根据具体场景,可选用下面任一种:

  • 使用匿名函数,通过下标取值;
  • 使用匿名函数,通过带星号的参数将参数名称映射到下标来取值;
  • 使用命名元组,通过属性名称或者下标取值。

前面介绍的旅行数据就是一个复杂结构的例子,原始数据是由位置点组成的普通时间序列。为了计算距离,我们将上述数据转换成了一系列路径段,每个元素是由起点、终点和距离组成的三元组。

每个路径段形如下面的三元组:

first_leg = (
    (37.549016, -76.330295),
    (37.840832, -76.273834),
    17.7246)

第一项和第二项分别代表起点和终点,第三项代表两点间的距离。这是Chesapeake Bay两地间的短途旅行。

嵌套元组可读性不佳,比如first_leg[0][0]很不容易理解。

除了元组之外的其他三种取值方法,第一种方法是定义一个简单的选择函数,通过下标位置取值。

start = lambda leg: leg[0]
end = lambda leg: leg[1]
distance = lambda leg: leg[2]
latitude = lambda pt: pt[0]
longitude = lambda pt: pt[1]

基于上面的函数,可以用latitude(start(first_leg))取特定的值,如下所示:

>>> latitude(start(first_leg))
29.050501

上面的定义没有提供关于返回结果的数据类型的信息,可以按照命名规则改进定义。为函数名称增加后缀的定义如下所示:

start_point = lambda leg: leg[0]
distance_nm = lambda leg: leg[2]
latitude_value = lambda point: point[0]

运用得当的话这种方法很有用,也可以用复杂的匈牙利命名法设置前缀(或者后缀)为各个变量命名。

为匿名函数添加类型标示有点画蛇添足,可做如下尝试:

>>> from typing import Tuple, Callable
>>> Point = Tuple[float, float]
>>> Leg = Tuple[Point, Point, float]
>>> start: Callable[[Leg], Point] = lambda leg: leg[0]

类型标示作为赋值语句的一部分,告知mypystart对象是可调用函数,接收类型为Leg的参数,返回结果的类型为Point

第二种方法是用带星号的参数隐藏下标位置。使用了*标记的函数示例如下:

start = lambda start, end, distance: start
end = lambda start, end, distance: end
distance = lambda start, end, distance: distance
latitude = lambda lat, lon: lat
longitude = lambda lat, lon: lon

基于以上函数,可以用latitude(*start(*first_leg))从原始数据中取值,如下所示:

>>> latitude(*start(*first_leg))
29.050501

这种方法的优点是可读性较好,位置和名称之间的关系由一组参数名称定义。虽然在元组参数前面加上星号使得函数看上去有点别扭,但星号运算符是必要的,它抽取元组中各个元素并将其分别赋给函数的每个参数。

这种方式更为函数式,但选择单个属性的语法容易混淆,Python提供了一种面向对象风格的替代方案:命名元组。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程