在点字符串上拆分和映射float函数的有效方法

问题描述

如何使用地图/其他任何高级功能生成点数组? 我正在使用下面的代码,该代码效果很好,但不可读,或者它是非常基本的版本。

有什么办法可以使用一些 advanced 技巧来生成相同的输出吗?我正在阅读map()函数,我们可以使用类似list(map(int,[3.3,4.3,5.3]))的函数。

t = "517.30,363.60;511.27,385.41;508.63,406.12;505.62,424.20;502.23,444.91;500.35,468.26"
# line below,but is not readable,not sure about performance
points = [[float(x.split(',')[0]),float(x.split(',')[1])] for x in t.split(';')]
print(points)

输出:

[[517.3,363.6],[511.27,385.41],[508.63,406.12],[505.62,424.2],[502.23,444.91],[500.35,468.26]]

解决方法

在Python中实际上需要map的情况很少见。通常,最好使用list / dict理解:

points = [[float(i) for i in x.split(',')]
          for x in t.split(';')]
,

使用map缩短它并将其分成两行以提高可读性:

>>> [[*map(float,x.split(','))]
     for x in t.split(';')]
[[517.3,363.6],[511.27,385.41],[508.63,406.12],[505.62,424.2],[502.23,444.91],[500.35,468.26]]

或者如果元组还可以(似乎它们可能是):

>>> [*map(ast.literal_eval,t.split(';'))]
[(517.3,363.6),(511.27,385.41),(508.63,406.12),(505.62,424.2),(502.23,444.91),(500.35,468.26)]

将我的第一个与Eugene的比较(三轮,结果相当稳定,它们的时间如此低=更快):

0.905 Eugene Pakhomov
0.869 superb rain

0.905 Eugene Pakhomov
0.864 superb rain

0.909 Eugene Pakhomov
0.867 superb rain

代码:

from timeit import repeat

funcs = {
    'Eugene Pakhomov': lambda: [[float(i) for i in x.split(',')]
                                for x in t.split(';')],'superb rain':     lambda: [[*map(float,'))]
                                for x in t.split(';')],}

t = "517.30,363.60;511.27,385.41;508.63,406.12;505.62,424.20;502.23,444.91;500.35,468.26"

for _ in range(3):
    for author,func in funcs.items():
        time = min(repeat(func,number=100000,repeat=20))
        print('%.3f' % time,author)
    print()

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...