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

Python 为什么此生成器返回单个列表,而另一个使用map的生成器保留列表格式?,python,csv,numpy,Python,Csv,Numpy,我想用python读取一些包含行向量的csv文件。行向量的长度不同,因此某些字段为空且包含空字符串。将这样一个列表列表转换为numpy数组会产生一个字符串数组,在我将数组转换为float(基于对的答案)的过程中,我提出了两个似乎相同但显然不同的解决方案。也许有人可以用语言来表达这种差异 解决方案1: def float_wrapper(reader): for row in reader: for val in row: if (type(val)

我想用python读取一些包含行向量的csv文件。行向量的长度不同,因此某些字段为空且包含空字符串。将这样一个列表列表转换为numpy数组会产生一个字符串数组,在我将数组转换为float(基于对的答案)的过程中,我提出了两个似乎相同但显然不同的解决方案。也许有人可以用语言来表达这种差异

解决方案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)
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)
解决方案2:

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)
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)
通用代码:

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)
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中的每个元素,它应用函数,并将相应的结果存储在列表中并返回。这就是为什么您会在第二个生成器中得到一个列表

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


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

,因为
映射
返回一个
列表
浮点
返回一个
浮点
(不是容器)我希望你能更详细地解释到底发生了什么,以及在幕后迭代了什么。thefourtheye做了我要做的:)我在原始帖子中有一个缩进错误,它改变了你的第二段,但我想帮助我理解的是,公共代码会在每次提到发电机中的“屈服”,干杯。