1

基本的に大きな xcel ファイルがあり、各列の最大値と最小値を持つリストを作成しようとしています。13 列あるため、while ループは 14 に達すると停止する必要があります。問題は、カウンターが増加すると、for ループを 1 回反復しないように見えることです。または、より明示的に言うと、while ループは for ループを 1 回だけ通過しますが、カウンターを 1 増やして 14 で停止するという点でループしているように見えます。入力ファイルの行は数値の文字列であることに注意してください。なぜそれらをタプルに変換し、指定された位置の値が column_max より大きいか、column_min より小さいかを確認します。その場合、column_max または column_min のいずれかを再割り当てします。これが完了すると、column_max と column_min がリスト ( l ) とカウンター (位置) に追加されます。次の列を繰り返すために増加されます。どんな助けでも大歓迎です。

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
4

2 に答える 2

3

forandwhileループの順序を入れ替えたいと思います。

これを行うには、少し良い方法があることに注意してください。

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]
于 2012-10-22T03:31:55.383 に答える
1

ファイルを消費すると、それは消費されたことになります。したがって、それを繰り返しても何も生成されません。

>>> 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

これが、コードが機能しない理由です。

次に、3 つの主なアプローチがあります。

  1. 毎回ファイルを読み取ります (I/O 操作では非効率的です)。
  2. リストにロードします(ファイル全体をメモリに保存するため、大きなファイルには非効率的です)。
  3. 行ごとに動作するようにロジックを作り直します (非常に実現可能で効率的ですが、すべてを 2 次元構造にロードして転置し、and を使用するほどコードは簡潔ではminありmaxません)。

3番目のアプローチの私のテクニックは次のとおりです。

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)
于 2012-10-22T03:51:33.403 に答える