我想阅读一些包含python行向量的csv文件。行向量具有不同的长度,因此一些字段为空并包含空字符串。将这样的列表列表转换为numpy数组会产生一个字符串数组,并且在我摆弄以将数组转换为float时(根据this question的答案)我提出了两个看起来与我相同的解决方案,但显然不是。也许有人可以将差异化为文字。
解决方案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)
解决方案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)
常用代码:
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时,它是原始格式的列表列表。为什么是这样?我可能缺少哪些其他选择?
答案 0 :(得分:1)
map
函数只能应用于iterable,并且对于iterable中的每个元素,它应用函数并将相应的结果存储在列表中并返回它。这就是你在第二个生成器中获得列表的原因。
在第一个解决方案中,您将获取每一行,然后是每个值并处理它,然后在每次迭代中返回它的最后一个值。因此,在公共代码中,当您使用for
运行reader
循环时,您将获得每行的单个元素。
在第二个解决方案中,您将获取每一行,并使用map
对所有值应用float
并生成列表。因此,在公共代码中,当您使用for
运行reader
循环时,您将获得处理的每一行的元素列表。