我正在读取一些.csv文件,并将每列附加到不同的列表中。
s := abc[1:]
sort.Slice(s, func(i, j int) bool {
return s[i] < s[j]
})
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
答案 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)))