从文本文件创建浮点列表列表的 Pythonic 方法
Pythonic way of creating a list of list of floats from text file
我正在逐行读取 csv_reader,并尝试在同一行上转换浮点数字符串列表。目前,我有:
list([float(i) for i in map(list, csv_reader)])
这显然行不通。我将如何实现我想要的?我也希望这一切都在一条线上。
我需要两个 map
函数吗?也许是两个 Pythonic for
循环?
我处理的函数是:
def csv_input(filename):
print(f'Currently reading the annotations from {filename}')
try:
csv_input_file = open(filename, 'rt')
except FileNotFoundError:
program_help()
print("[Error] Input File not found")
csv_reader = csv.reader(csv_input_file, delimiter=',')
unfiltered_annots = list(float(i) for i in map(list, csv_reader))
csv_input_file.close()
return unfiltered_annots
我的 CSV 文件如下所示:
11, 11, 24, 24, 0.75
10, 11, 20, 20, 0.8
11, 9, 24, 24, 0.7
40, 42, 20, 20, 0.6
我得到的错误是:
Traceback (most recent call last):
File "maximal_supression.py", line 124, in test_google_doc_example
unfiltered_annots = csv_input('example_input.csv')
File "maximal_supression.py", line 34, in csv_input
unfiltered_annots = list(float(i) for i in map(list, csv_reader))
File "maximal_supression.py", line 34, in <genexpr>
unfiltered_annots = list(float(i) for i in map(list, csv_reader))
TypeError: float() argument must be a string or a number, not 'list'
您正在尝试将列表转换为浮点数。如果你想将列表的元素转换为浮点数,你应该另外在你的列表理解中遍历你的列表:
unfiltered_annots = list([[float(i) for i in l] for l in map(list, csv_reader)])
在我稍微转换的代码中(为简单起见):
import csv
csv_input_file = open('a.csv', 'rt')
csv_reader = csv.reader(csv_input_file, delimiter=',')
unfiltered_annots = list([[float(i) for i in l] for l in map(list, csv_reader)])
csv_input_file.close()
unfiltered_annots
它returns列表列表:
[[11.0, 11.0, 24.0, 24.0, 0.75],
[10.0, 11.0, 20.0, 20.0, 0.8],
[11.0, 9.0, 24.0, 24.0, 0.7],
[40.0, 42.0, 20.0, 20.0, 0.6]]
P.S。正如 @meowgoesthedog 提到的,csv_reader
returns 列表因此您不需要将列表映射到 csv_reader:
unfiltered_annots = [list(map(float, l)) for l in csv_reader]
我正在逐行读取 csv_reader,并尝试在同一行上转换浮点数字符串列表。目前,我有:
list([float(i) for i in map(list, csv_reader)])
这显然行不通。我将如何实现我想要的?我也希望这一切都在一条线上。
我需要两个 map
函数吗?也许是两个 Pythonic for
循环?
我处理的函数是:
def csv_input(filename):
print(f'Currently reading the annotations from {filename}')
try:
csv_input_file = open(filename, 'rt')
except FileNotFoundError:
program_help()
print("[Error] Input File not found")
csv_reader = csv.reader(csv_input_file, delimiter=',')
unfiltered_annots = list(float(i) for i in map(list, csv_reader))
csv_input_file.close()
return unfiltered_annots
我的 CSV 文件如下所示:
11, 11, 24, 24, 0.75
10, 11, 20, 20, 0.8
11, 9, 24, 24, 0.7
40, 42, 20, 20, 0.6
我得到的错误是:
Traceback (most recent call last):
File "maximal_supression.py", line 124, in test_google_doc_example
unfiltered_annots = csv_input('example_input.csv')
File "maximal_supression.py", line 34, in csv_input
unfiltered_annots = list(float(i) for i in map(list, csv_reader))
File "maximal_supression.py", line 34, in <genexpr>
unfiltered_annots = list(float(i) for i in map(list, csv_reader))
TypeError: float() argument must be a string or a number, not 'list'
您正在尝试将列表转换为浮点数。如果你想将列表的元素转换为浮点数,你应该另外在你的列表理解中遍历你的列表:
unfiltered_annots = list([[float(i) for i in l] for l in map(list, csv_reader)])
在我稍微转换的代码中(为简单起见):
import csv
csv_input_file = open('a.csv', 'rt')
csv_reader = csv.reader(csv_input_file, delimiter=',')
unfiltered_annots = list([[float(i) for i in l] for l in map(list, csv_reader)])
csv_input_file.close()
unfiltered_annots
它returns列表列表:
[[11.0, 11.0, 24.0, 24.0, 0.75], [10.0, 11.0, 20.0, 20.0, 0.8], [11.0, 9.0, 24.0, 24.0, 0.7], [40.0, 42.0, 20.0, 20.0, 0.6]]
P.S。正如 @meowgoesthedog 提到的,csv_reader
returns 列表因此您不需要将列表映射到 csv_reader:
unfiltered_annots = [list(map(float, l)) for l in csv_reader]