如何避免列表理解中不必要的工作?

时间:2017-08-21 18:03:15

标签: python

我想像这样转换字符串:

"1.2 1.5, 3.2 1.9, 4.4 4.1"[(1.2 1.5), (3.2 1.9), (4.4 4.1)]

我有以下算法:

[(float(x.split()[0]), float(x.split()[1])) for x in s.split(',')]

如何只使用一个x.split()而不是两个?

4 个答案:

答案 0 :(得分:3)

假设你的意思是浮动元组的列表(你的表示中缺少逗号),你可以使用map来转换一个.split()而不是你想要摆脱的重复。

s = "1.2 1.5, 3.2 1.9, 4.4 4.1"
[tuple(map(float, x.split())) for x in s.split(',')]
# [(1.2, 1.5), (3.2, 1.9), (4.4, 4.1)]

如果您想使用生成器而不是map -

[tuple(float(y) for y in x.split()) for x in s.split(',')]

您可以根据需要将tuple替换为list

答案 1 :(得分:1)

您可以将列表拆分为不同的细分,首先使用","作为分隔符,然后使用" "

s = "1.2 1.5, 3.2 1.9, 4.4 4.1"

new_data = [tuple(map(float, i.split())) for i in s.split(",")]

答案 2 :(得分:1)

无论如何你必须分组,所以唯一要缩短的是删除内部分裂的显式处理:

>>> [tuple(map(float, x.split())) for x in s.split(',')]
[(1.2, 1.5), (3.2, 1.9), (4.4, 4.1)]

这也使它适应任何长度的逗号分隔组。

答案 3 :(得分:1)

使用re进行一次拆分:

import re
a = "1.2 1.5, 3.2 1.9, 4.4 4.1"
b = re.split(' |, ', a)
res = [tuple(map(float, (b[i],b[i+1]))) for i in range(0,len(b),2)]