我想阅读一些包含python行向量的csv文件 . 行向量具有不同的长度,因此一些字段为空并包含空字符串 . 将这样的列表列表转换为numpy数组会产生一个字符串数组,并且在我的摆弄期间将数组转换为float(基于this question的答案)我提出了两个似乎与我相同的解决方案,但显然不是 . 也许有人可以把差异化为文字 .
Solution 1:
def float_wrapper(reader):
for row in reader:
for val in row:
if (type(val) == str) and (len(val) == 0):
val = 0.0
yield float(val)
Solution 2:
def str2float2(val):
if type(val) == str:
if len(val) == 0:
val = 0.0
return float(val)
def float_wrapper(reader):
for row in reader:
yield map(str2float2, row)
Common code:
A = []
with open('parameters.csv', 'rb') as csvfile:
reader = csv.reader(csvfile, delimiter=',', quoting = csv.QUOTE_NONNUMERIC)
reader = float_wrapper(reader)
for row in reader:
A.append(row)
对于解决方案1,A是单个浮点列表,而使用解决方案2时,它是原始格式的列表列表 . 为什么是这样?我可能缺少哪些其他选择?
1 回答
map
函数只能应用于iterable,并且对于iterable中的每个元素,它应用函数并将相应的结果存储在列表中并返回它 . 这就是你在第二台发电机上得到一个清单的原因 .在第一个解决方案中,您将获取每一行,然后是每个值并处理它,然后在每次迭代中返回它的最后一个值 . 因此,在公共代码中,当您使用
reader
运行for
循环时,您将为每一行获取单个元素 .在第二个解决方案中,您将获取每一行,并使用
map
为所有值应用float
并生成列表 . 因此,在公共代码中,当您使用reader
运行for
循环时,您将获得处理的每一行的元素列表 .