2014-07-01 67 views
0

我已经在一列被格式化,即使格式的数据的列表:分割的格式化数据列表

['[ 0.93913063 0.28020878 0.2769496 ]', 
'[ 0.21672141 0.29633945 0.19763641]', 
'[ 0.74718183 0.33466203 0.13866566]', 
'[ 0.1067503 0.20448574 0.16817043]', 
'[ 0.1223612 0.11653754 0.13288494]', 
'[ 0.48761208 0.78240743 0.38697977]', 
'[ 0.4300345 0.50380231 0.48102237]'] 

我想这个数据分割成类似的列表:

[(0.93913063,0.28020878,0.2769496),(0.21672141,0.29633945,0.19763641),(0.74718183,0.33466203,0.13866566),(0.1067503, 0.20448574,0.16817043),(0.1223612,0.11653754,0.13288494),(0.48761208,0.78240743,0.38697977),(0.4300345,0.50380231,0.48102237)] 

的我遇到的问题是我要拆分数据,然后将它们按照我想要的格式拼凑在一起,但是括号中的值之间没有一致的空格。 所以这就是我在做什么:

def removefront(s): 
    return s[2:] 
def removeend(s): 
    return s[:-2] 

valuelist = [] 
i = 0 
for x in xrange(0,len(data)): 
    print data[i] 
    a,b,d = data[i].split(' ') 
    p1 = removefront(a) 
    p3 = removeend(d) 
    p1 = float(p1) 
    p2 = float(b) 
    p3 = float(p3) 
    coord = (p1, p2, p3) 
    i += 1 
    valuelist.append(coord) 

任何帮助,非常感谢。谢谢!

回答

1

这个列表解析感觉有点鲁贝戈德堡十岁上下,但这里是我的裂纹它。

>>> l = ['[ 0.93913063 0.28020878 0.2769496 ]', 
'[ 0.21672141 0.29633945 0.19763641]', 
'[ 0.74718183 0.33466203 0.13866566]', 
'[ 0.1067503 0.20448574 0.16817043]', 
'[ 0.1223612 0.11653754 0.13288494]', 
'[ 0.48761208 0.78240743 0.38697977]', 
'[ 0.4300345 0.50380231 0.48102237]'] 

>>> [tuple(map(float,i[2:-1].split())) for i in l] 

输出

[(0.93913063, 0.28020878, 0.2769496), 
(0.21672141, 0.29633945, 0.19763641), 
(0.74718183, 0.33466203, 0.13866566), 
(0.1067503, 0.20448574, 0.16817043), 
(0.1223612, 0.11653754, 0.13288494), 
(0.48761208, 0.78240743, 0.38697977), 
(0.4300345, 0.50380231, 0.48102237)] 
+0

谢谢!这工作,很简单。 –

2

您可以使用列表理解与这里的一些字符串方法:

>>> s = ['[ 0.93913063 0.28020878 0.2769496 ]', '[ 0.21672141 0.29633945 0.19763641]', '[ 0.74718183 0.33466203 0.13866566]', '[ 0.1067503 0.20448574 0.16817043]', '[ 0.1223612 0.11653754 0.13288494]', '[ 0.48761208 0.78240743 0.38697977]', '[ 0.4300345 0.50380231 0.48102237]'] 
>>> [map(float, x.strip('[]').split()) for x in s] 
[[0.93913063, 0.28020878, 0.2769496], [0.21672141, 0.29633945, 0.19763641], [0.74718183, 0.33466203, 0.13866566], [0.1067503, 0.20448574, 0.16817043], [0.1223612, 0.11653754, 0.13288494], [0.48761208, 0.78240743, 0.38697977], [0.4300345, 0.50380231, 0.48102237]] 

这里str.strip('[]')将删除字符串[],然后我们在空格分割数据,然后我们应用float()到每个项目。

另一种选择是用在这里ast.literal_eval用正则表达式:

>>> import re 
>>> from ast import literal_eval 
>>> r = re.compile(r'(\d)\s') 
>>> [literal_eval(r.sub(r'\1,', x)) for x in s] 
[[0.93913063, 0.28020878, 0.2769496], [0.21672141, 0.29633945, 0.19763641], [0.74718183, 0.33466203, 0.13866566], [0.1067503, 0.20448574, 0.16817043], [0.1223612, 0.11653754, 0.13288494], [0.48761208, 0.78240743, 0.38697977], [0.4300345, 0.50380231, 0.48102237]] 
0

这将是一个非常适合的正则表达式:

>>> import re 
>>> data = '[ 0.93913063 0.28020878 0.2769496 ]' 
>>> tuple(map(float, re.findall(r"([\d\.]+)", data))) 
(0.93913063, 0.28020878, 0.2769496) 

这将忽略任何空白,并提取数字和小数点的所有组。