2012-05-29 31 views
0

我有三个不同的分隔符(第一个有空格到数字,第二个3个空格到数字和最后一列空格然后一个制表符号),我希望能够生成一个列表,包含每列的顺序值。Python:三列不同的分隔符,列到列表,最快的方式

8000.5 16745  0.1257 
8001.0 16745  0.1242 
8001.5 16745  0.1565 
8002.0 16745  0.1595 
8002.5 16745  0.1093 
8003.0 16745  0.1644 

我尝试了一些东西与重新。在转换为字符串后,看看我是否可以用这种方式解析它,但它似乎有点冗长的转换,我想知道是否有人知道更快的方法。理想的输出将是

list 1 = [8000.5, 8001.0, 8001.5 ...] 
list 2 = [16745, 16745, 16745, ...] 
list 3 = [0.1257, 0.1242, 0.1565, ...] 

谢谢!

回答

1

只需使用.split();它会采取空白和分割上的任何量(忽略前后空白干脆):

>>> ex = ' 8000.5 16745  0.1257' 
>>> ex.split() 
['8000.5', '16745', '0.1257'] 

如果你需要浮点数,而不是字符串,简单地套用float()每个值使用map

>>> ex = ' 8000.5 16745  0.1257' 
>>> map(float, ex.split()) 
[8000.5, 16745.0, 0.1257] 
+1

是必要的'strip'实际?我认为只是使用'split'应该照顾它。 – mgilson

+0

有关如何获取列表的更好的想法? – Mayli

+0

@mgilson:heh,如果你在其他值上拆分,则前导项目包含在拆分中(例如''/one/two'.split('/')'>'['','one','two']] '但是没有任何争论,事实上,这个地带是不需要的 –

1

使用split()

strs = """ 8000.5 16745  0.1257 
8001.0 16745  0.1242 
8001.5 16745  0.1565 
8002.0 16745  0.1595 
8002.5 16745  0.1093 
8003.0 16745  0.1644""" 

list_col= map(list,zip(*(map(float,x.split()) for x in strs.split('\n')))) 

print(list(list_col)) 

输出:名单列表列

[[8000.5, 8001.0, 8001.5, 8002.0, 8002.5, 8003.0], [16745.0, 16745.0, 16745.0, 16745.0, 16745.0, 16745.0], [0.1257, 0.1242, 0.1565, 0.1595, 0.1093, 0.1644]] 
0
txt = """ 8000.5 16745  0.1257 
8001.0 16745  0.1242 
8001.5 16745  0.1565 
8002.0 16745  0.1595 
8002.5 16745  0.1093 
8003.0 16745  0.1644 """ 

data = zip(*((float(s) for s in row.split()) for row in txt.split('\n'))) 

结果

[(8000.5, 8001.0, 8001.5, 8002.0, 8002.5, 8003.0), 
(16745.0, 16745.0, 16745.0, 16745.0, 16745.0, 16745.0), 
(0.1257, 0.1242, 0.1565, 0.1595, 0.1093, 0.1644)] 
+0

使用'map()'而不是两个for循环。 –

+0

@AshwiniChaudhary:我想如果你仔细观察,你会找到我们的答案以相同的顺序完成相同数量的工作;唯一的区别是,我发现我的工作更容易阅读。 –

0

另一种方式做到这一点(s是初始字符串):

>>> [map(float, col) for col in zip(*map(str.split, s.splitlines()))] 
[[8000.5, 8001.0, 8001.5, 8002.0, 8002.5, 8003.0], 
[16745.0, 16745.0, 16745.0, 16745.0, 16745.0, 16745.0], 
[0.1257, 0.1242, 0.1565, 0.1595, 0.1093, 0.1644]]