python中的嵌套for循环不起作用

python中的嵌套for循环不起作用,python,Python,我们基本上有一个很大的xcel文件,我想做的是创建一个列表,其中包含每列的最大值和最小值。共有13列,这就是while循环在到达14列时应该停止的原因。问题是,一旦计数器增加,它似乎不会在for循环中迭代一次。或者更明确地说,while循环只经过for循环一次,但它似乎确实在循环,因为它将计数器增加1,并在14处停止。应该注意的是,输入文件中的行是数字字符串,这就是为什么我将它们转换为元组,然后检查给定位置的值是否大于列_max或小于列_min。如果是这样,我将重新指定列_max或列_min。完

我们基本上有一个很大的xcel文件,我想做的是创建一个列表,其中包含每列的最大值和最小值。共有13列,这就是while循环在到达14列时应该停止的原因。问题是,一旦计数器增加,它似乎不会在for循环中迭代一次。或者更明确地说,while循环只经过for循环一次,但它似乎确实在循环,因为它将计数器增加1,并在14处停止。应该注意的是,输入文件中的行是数字字符串,这就是为什么我将它们转换为元组,然后检查给定位置的值是否大于列_max或小于列_min。如果是这样,我将重新指定列_max或列_min。完成后,列_max和列_min将被追加到列表l和计数器position增加,以重复下一列。任何帮助都将不胜感激

input_file = open('names.csv','r')
l= []  
column_max = 0
column_min = 0
counter = 0
while counter<14:
    for row in input_file:
        row = row.strip()
        row = row.split(',')
        row = tuple(row)
        if (float(row[counter]))>column_max:
            column_max = float(row[counter])  
        elif (float(row[counter]))<column_min:
            column_min = float(row[counter])    
        else:
            column_min=column_min
            column_max = column_max
    l.append((column_max,column_min))
    counter = counter + 1

我认为您需要切换for和while循环的顺序

请注意,有一种稍微好一点的方法可以做到这一点:

with open('yourfile') as infile:
    #read first row.  Set column min and max to values in first row
    data = [float(x) for x in infile.readline().split(',')]
    column_maxs = data[:]
    column_mins = data[:]
    #read subsequent rows getting new min/max
    for line in infile:
        data = [float(x) for x in line.split(',')]
        for i,d in enumerate(data):
            column_maxs[i] = max(d,column_maxs[i])
            column_mins[i] = min(d,column_mins[i])
如果您有足够的内存,可以立即将文件保存在内存中,这将变得更加容易:

with open('yourfile') as infile:
    data = [map(float,line.split(',')) for line in infile]
    data_transpose = zip(*data)
    col_mins = [min(x) for x in data_transpose]
    col_maxs = [max(x) for x in data_transpose]

我认为您需要切换for和while循环的顺序

请注意,有一种稍微好一点的方法可以做到这一点:

with open('yourfile') as infile:
    #read first row.  Set column min and max to values in first row
    data = [float(x) for x in infile.readline().split(',')]
    column_maxs = data[:]
    column_mins = data[:]
    #read subsequent rows getting new min/max
    for line in infile:
        data = [float(x) for x in line.split(',')]
        for i,d in enumerate(data):
            column_maxs[i] = max(d,column_maxs[i])
            column_mins[i] = min(d,column_mins[i])
如果您有足够的内存,可以立即将文件保存在内存中,这将变得更加容易:

with open('yourfile') as infile:
    data = [map(float,line.split(',')) for line in infile]
    data_transpose = zip(*data)
    col_mins = [min(x) for x in data_transpose]
    col_maxs = [max(x) for x in data_transpose]

一旦您使用了该文件,它就被使用了。因此,再次迭代不会产生任何结果

>>> for row in input_file:
...     print row
1,2,3,...
4,5,6,...
etc.
>>> for row in input_file:
...     print row
>>> # Nothing gets printed, the file is consumed
这就是代码不起作用的原因

然后有三种主要方法:

每次I/O操作效率低下时读取文件; 将其加载到大型文件的列表中,因为它将整个文件存储在内存中; 重新设计逻辑以逐行操作,这是非常可行和高效的,尽管在代码中不像将其全部加载到二维结构中,并对其进行转换和使用最小值和最大值那样简单。 以下是我对第三种方法的技巧:

maxima = [float('-inf')] * 13
minima = [float('inf')] * 13
with open('names.csv') as input_file:
    for row in input_file:
        for col, value in row.split(','):
            value = float(value)
            maxima[col] = max(maxima[col], value)
            minima[col] = min(minima[col], value)

# This gets the value you called ``l``
combined_max_and_min = zip(maxima, minima)

一旦您使用了该文件,它就被使用了。因此,再次迭代不会产生任何结果

>>> for row in input_file:
...     print row
1,2,3,...
4,5,6,...
etc.
>>> for row in input_file:
...     print row
>>> # Nothing gets printed, the file is consumed
这就是代码不起作用的原因

然后有三种主要方法:

每次I/O操作效率低下时读取文件; 将其加载到大型文件的列表中,因为它将整个文件存储在内存中; 重新设计逻辑以逐行操作,这是非常可行和高效的,尽管在代码中不像将其全部加载到二维结构中,并对其进行转换和使用最小值和最大值那样简单。 以下是我对第三种方法的技巧:

maxima = [float('-inf')] * 13
minima = [float('inf')] * 13
with open('names.csv') as input_file:
    for row in input_file:
        for col, value in row.split(','):
            value = float(value)
            maxima[col] = max(maxima[col], value)
            minima[col] = min(minima[col], value)

# This gets the value you called ``l``
combined_max_and_min = zip(maxima, minima)

用于范围14中的i,而不是while循环。另外,您可能希望使用csvreader而不是按拆分:csvreader将处理包含逗号的字符串。如果有13列,您将使用13作为边界值,而不是14。我将使用列\u max=0和列\u min=0,而不是列\u max=float'-inf'和列\u min=float'inf'。这样你就知道最大值和最小值是正确的。使用范围14中的i代替while循环。另外,您可能希望使用csvreader而不是按拆分:csvreader将处理包含逗号的字符串。如果有13列,您将使用13作为边界值,而不是14。我将使用列\u max=0和列\u min=0,而不是列\u max=float'-inf'和列\u min=float'inf'。这样你就知道最大值和最小值是正确的。仅仅交换两个循环是不够的;行=行也需要从内部循环中取出。但是你说得很对:min和max是正确的方法。这需要每行的最大值,但是问题中的代码是用来计算每列的最大值的。否则+1。@ChrisMorgan-是,关联的逻辑也应该被移动。我想这很明显…@BrianL-抓得好。相应地更新。我想你想切换for和while循环的顺序:不,他不。。。这是对这个问题的转置解释的遗迹。仅仅交换两个循环是不够的;行=行也需要从内部循环中取出。但是你说得很对:min和max是正确的方法。这需要每行的最大值,但是问题中的代码是用来计算每列的最大值的。否则+1。@ChrisMorgan-是,关联的逻辑也应该被移动。我想这很明显…@BrianL-抓得好。相应地更新。我想你想切换for和while循环的顺序:不,他不。。。这是对这个问题的转置解释的遗留问题。我唯一的不满是,你本质上硬编码了列的数量,而我的版本没有硬编码列的数量。另外,不需要row.strip,因为float不关心空格。@mgilson:它可以在没有硬编码的情况下处理,但它更难看。作为参考,这将类似于浮动
f’if col>lenmaxima else maxima[col]。要么这样,要么复制行读取代码。总而言之,我认为硬编码的值通常会,虽然并不总是更合适。至于脱衣舞这件事,我想了想,但由于懒惰而放弃了。您现在提示我删除它。我唯一的不满是您实际上硬编码了列的数量,而我的版本没有硬编码列的数量。另外,不需要row.strip,因为float不关心空格。@mgilson:它可以在没有硬编码的情况下处理,但它更难看。作为参考,如果col>lenmaxima-else-maxima[col],则类似于float'-inf'。要么这样,要么复制行读取代码。总而言之,我认为硬编码的值通常会,虽然并不总是更合适。至于脱衣舞这件事,我想了想,但由于懒惰而放弃了。您现在提示我将其删除。