问题描述
如何使用地图/其他任何高级功能生成点数组? 我正在使用下面的代码,该代码效果很好,但不可读,或者它是非常基本的版本。
有什么办法可以使用一些 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()