使用列表推导创建子列表

时间:2020-02-05 10:29:50

标签: python python-3.x

我正在读取一些.csv文件,并将每列附加到不同的列表中。

.csv文件示例:

s := abc[1:]
sort.Slice(s, func(i, j int) bool {
    return s[i] < s[j]
})

有效的Python代码

0, 1
2, 3
4, 5

由于我正在读取数百万个.csv文件,因此我想使用列表推导而不是lst_a = [] lst_b = [] with open(csv_file, 'r') as f_read: csv_reader = csv.reader(f_read, delimiter = ',') for row in csv_reader: lst_a.append(float(row[0])) lst_b.append(float(row[1])) print(lst_a) # [0, 2, 4] print(lst_b) # [1, 3, 5] 来加快速度。但是,到目前为止没有成功。我可以获取列表列表,但这不是我想要的:for loop

3 个答案:

答案 0 :(得分:4)

这不是好习惯,也不是漂亮的python代码,但是:

[(lst_a.append(float(row[0])), lst_b.append(float(row[1]))) for row in csv_reader] 

有效。不建议这样做的原因是因为您正在创建带有副作用的None列表,并且列表推导被设计为具有简单的功能,并且具有输出,并且在推导中没有副作用。 “ append”代码仅会执行,因为python解释器会尝试评估列表,即使不需要列表也是如此。这是为for循环创建的情况!但是,当然,选择是您的。

编辑:使用zip简洁明了:

lst_a, lst_b = [[float(i) for i in x] for x in zip(*csv_reader)]

但不执行。这是因为zip将对csv的行进行n次迭代,其中n是列数,而没有zip的for循环或列表理解则不会。因此,如果您拥有一百万行十列的csv,这会大大降低您的速度。

答案 1 :(得分:2)

只需使用zip!它将所有第1个元素,所有第2个元素压缩在一起...

>>> with open(csv_file, 'r') as f_read:
...     csv_reader = csv.reader(f_read, delimiter = ',')
...     print(list(zip(*csv_reader)))
... 
[('0', '2', '4'), ('1', '3', '5')]

*csv_reader-明星是列表拆包=我们将列表的元素作为单独的参数传递。这样一来,它将所有子列表都视为zip的输入列表。

zip的结果是一个zip对象-迭代时产生的生成器,因此我不得不使用list()来打印结果。

答案 2 :(得分:1)

您可以使用zip并通过阅读器一次完成此操作:

lst_a,lst_b = map(list,zip(*(map(float,row) for row in csvReader)))