为什么这个生成器返回一个列表,而另一个使用map的生成器保留listoflists格式?

2024-03-28 23:08:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用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中,它是原始格式的列表列表。为什么会这样?我可能会错过哪些其他选择


Tags: csv字符串in列表forifdefval
1条回答
网友
1楼 · 发布于 2024-03-28 23:08:58

map函数只能应用于iterable,对于iterable中的每个元素,它应用该函数,并将相应的结果存储在列表中并返回它。这就是为什么你会在第二个生成器中得到一个列表

在第一个解决方案中,您获取每一行,然后获取每一个值并处理它,然后在每次迭代中返回它的最后一个值。因此,在公共代码中,当您使用reader运行for循环时,您将为每一行获得一个元素

在第二种解决方案中,您将获取每一行,并使用map对所有值应用float,并生成一个列表。因此,在公共代码中,当您使用reader运行for循环时,您将得到处理的每一行的元素列表

相关问题 更多 >