首页 文章

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

提问于
浏览
0

我想阅读一些包含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 回答

  • 1

    map 函数只能应用于iterable,并且对于iterable中的每个元素,它应用函数并将相应的结果存储在列表中并返回它 . 这就是你在第二台发电机上得到一个清单的原因 .

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

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

相关问题