【问题标题】:Why does this generator return a single list while another one using map retains the list-of-lists format?为什么这个生成器返回一个列表,而另一个使用 map 的生成器保留列表列表格式?
【发布时间】:2013-11-22 08:11:32
【问题描述】:

我想用 python 读取一些包含行向量的 csv 文件。行向量的长度不同,因此某些字段为空且包含空字符串。将这样一个列表列表转换为一个 numpy 数组会产生一个字符串数组,并且在我将数组转换为浮点数的过程中(基于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,它是原始格式的列表列表。为什么是这样?我还可能缺少哪些其他替代方案?

【问题讨论】:

  • 因为map 返回一个list & float 返回一个float(不是容器)
  • 我希望能更详细地解释到底发生了什么以及幕后正在迭代什么。
  • thefourtheye 做了我想做的事 :)

标签: python csv numpy


【解决方案1】:

map 函数只能应用于可迭代对象,并且对于可迭代对象中的每个元素,它都会应用函数并将相应的结果存储在列表中并返回。这就是您在第二个生成器中获得列表的原因。

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

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

【讨论】:

  • 我在原始帖子中有一个缩进错误,它改变了你的第二段,但我想帮助我理解的是通用代码迭代生成器中每次提到“yield”。干杯。
猜你喜欢
  • 2019-05-04
  • 2021-07-06
  • 1970-01-01
  • 2015-01-16
  • 2016-01-28
  • 2018-12-13
  • 1970-01-01
  • 2015-04-15
  • 1970-01-01
相关资源
最近更新 更多