我想用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中,它是单个浮动列表,而在解决方案2中,它是原始格式的列表列表。为什么会这样?我可能会错过哪些其他选择
map
函数只能应用于iterable,对于iterable中的每个元素,它应用该函数,并将相应的结果存储在列表中并返回它。这就是为什么你会在第二个生成器中得到一个列表在第一个解决方案中,您获取每一行,然后获取每一个值并处理它,然后在每次迭代中返回它的最后一个值。因此,在公共代码中,当您使用
reader
运行for
循环时,您将为每一行获得一个元素在第二种解决方案中,您将获取每一行,并使用
map
对所有值应用float
,并生成一个列表。因此,在公共代码中,当您使用reader
运行for
循环时,您将得到处理的每一行的元素列表相关问题 更多 >
编程相关推荐