python中的嵌套for循环不起作用
我们基本上有一个很大的xcel文件,我想做的是创建一个列表,其中包含每列的最大值和最小值。共有13列,这就是while循环在到达14列时应该停止的原因。问题是,一旦计数器增加,它似乎不会在for循环中迭代一次。或者更明确地说,while循环只经过for循环一次,但它似乎确实在循环,因为它将计数器增加1,并在14处停止。应该注意的是,输入文件中的行是数字字符串,这就是为什么我将它们转换为元组,然后检查给定位置的值是否大于列_max或小于列_min。如果是这样,我将重新指定列_max或列_min。完成后,列_max和列_min将被追加到列表l和计数器position增加,以重复下一列。任何帮助都将不胜感激python中的嵌套for循环不起作用,python,Python,我们基本上有一个很大的xcel文件,我想做的是创建一个列表,其中包含每列的最大值和最小值。共有13列,这就是while循环在到达14列时应该停止的原因。问题是,一旦计数器增加,它似乎不会在for循环中迭代一次。或者更明确地说,while循环只经过for循环一次,但它似乎确实在循环,因为它将计数器增加1,并在14处停止。应该注意的是,输入文件中的行是数字字符串,这就是为什么我将它们转换为元组,然后检查给定位置的值是否大于列_max或小于列_min。如果是这样,我将重新指定列_max或列_min。完
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'。要么这样,要么复制行读取代码。总而言之,我认为硬编码的值通常会,虽然并不总是更合适。至于脱衣舞这件事,我想了想,但由于懒惰而放弃了。您现在提示我将其删除。