Python 2d列表生成器在一行

时间:2017-11-02 16:44:22

标签: python generator

我在文件中有一个数字矩阵(城市之间的距离用于解决TSP)。我把它加载到一个列表中。之后,我列表中的每一行都是这样的:

' 9999    3    5   48   48    8    8    5    5    3    3    0    3    5    8    8    5\n'

每行之间的数字空格数可能不同。现在我只想将其转换为整数/浮点数列表。我得到了一个循环:

matrix = []
for row in lines[begin:end]:
    matrix.append([float(x) for x in row.split()])

它运作得很好。我只是好奇我是否可以在这里使用一个生成器(就像我在循环中使用它),但不是在循环中,而是在一行中。我尝试了类似[float(x) for x in [y.split() for y in lines[begin:end]]]的内容,但它说:

float() argument must be a string or a number, not 'list'

所以可以像在一行中那样解决,还是应该把它留在循环中?

2 个答案:

答案 0 :(得分:5)

您可以使用以下列表理解

matrix = [[float(i) for i in row.split()] for row in lines]

但对于这种特殊情况,使用numpy.genfromtxt

要快得多
import numpy as np
matrix = np.genfromtxt('your_file', delimeter=' ')

答案 1 :(得分:1)

当然可以。

my_list = [' 9999    3    5   48   48    8    8    5    5    3    3    0    3    5    8    8    5\n', 
           ' 3    12    5   48   48    8    8    5    5    3    3    0    3    5    8    8    5\n']

gen = (list(map(float, f.split())) for f in my_list)

您现在可以遍历gen

例如:

for i in gen:
  print(i)
  • 首次迭代返回:[9999.0, 3.0, 5.0, 48.0, 48.0, 8.0, ...]
  • 第二个:[3.0, 12.0, 5.0, 48.0, 48.0, 8.0, ...]

我假设generator你实际上是generator,而不是list-comprehension。如果情况并非如此,那么@Cody的回答就是你要做的。