Python - 从列创建列表

时间:2013-01-11 11:32:38

标签: python list

如何从中创建(两列,固定宽度):

0.35    23.8
0.39    23.7
0.43    23.6
0.47    23.4
0.49    23.1
0.51    22.8
0.53    22.4
0.55    21.6

两个清单:

list1 = [0.35, 0.39, 0.43, ...]
list2 = [23.8, 23.7, 23.6, ...]

谢谢。

2 个答案:

答案 0 :(得分:16)

可能你正在寻找类似的东西

>>> str1 = """0.35    23.8
0.39    23.7
0.43    23.6
0.47    23.4
0.49    23.1
0.51    22.8
0.53    22.4
0.55    21.6"""
>>> zip(*(e.split() for e in str1.splitlines()))
[('0.35', '0.39', '0.43', '0.47', '0.49', '0.51', '0.53', '0.55'), ('23.8', '23.7', '23.6', '23.4', '23.1', '22.8', '22.4', '21.6')]

您可以轻松扩展上述解决方案,以迎合任何类型的迭代,包括文件

>>> with open("test1.txt") as fin:
    print zip(*(e.split() for e in fin))


[('0.35', '0.39', '0.43', '0.47', '0.49', '0.51', '0.53', '0.55'), ('23.8', '23.7', '23.6', '23.4', '23.1', '22.8', '22.4', '21.6')]

如果你想将数字作为浮点数而不是字符串,你需要通过map函数传递float函数

>>> zip(*(map(float, e.split()) for e in str1.splitlines()))
[(0.35, 0.39, 0.43, 0.47, 0.49, 0.51, 0.53, 0.55), (23.8, 23.7, 23.6, 23.4, 23.1, 22.8, 22.4, 21.6)]

最后将其解压缩到两个单独的列表

>>> from itertools import izip
>>> column_tuples = izip(*(map(float, e.split()) for e in str1.splitlines()))
>>> list1, list2 = map(list, column_tuples)
>>> list1
[0.35, 0.39, 0.43, 0.47, 0.49, 0.51, 0.53, 0.55]
>>> list2
[23.8, 23.7, 23.6, 23.4, 23.1, 22.8, 22.4, 21.6]

如何运作

zip获取一个可迭代列表,并返回每个迭代器的成对元组列表。 itertools.izip是类似的,但它不返回成对元组列表,而是返回成对元组的迭代器。这将是更加友好的内存

map将一个函数应用于迭代器的每个元素。所以map(float, e.split)会将字符串转换为浮点数。请注意,表示地图的另一种方法是通过LC或生成器表达式

最后str.splitlines将换行符分隔的字符串转换为单独的行列表。

答案 1 :(得分:0)

试试这个:

splitted = columns.split()
list1 = splitted[::2] #column 1
list2 = splitted[1::2] #column 2