2

名前、都市、番号のリストを含むファイルを開き、都市ごとの番号の平均をとる関数を作成しようとしています。

私はこれまでに次のようなものを持っています:

numbers = 0
count = 0
n = 0
while n < len(file):
    for item in file:
        if item.split(' ')[-2] == city:
            count += 1
            numbers += float(item.split(' ')[-1])
            n += 1
        else:
            n += 1
    return numbers / count

ここで、[-2]は都市の位置、[-1]は番号の位置です。ファイルがすでに開いていると仮定します。

私のコードはファイル全体を実行し、最後の行にあるものだけを返します。したがって、ファイルの最後の行にロンドンの人がいて、ロンドンの平均をとろうとしている場合は、その1つの番号が表示されます。他の都市の平均をとろうとすると、何も返されません。

カウントを更新せずにファイル全体をループするのはなぜですか?また、どうすれば修正できますか?

編集:

コードを編集すると、ファイルは次のようになります。

NAME1     COUNTRY     CITY     NUMBER

各行に。

4

1 に答える 1

1

まず、item.split('')は次のようなものを生成します。

['foo', '', '', '', '', 'spam', '', 'foo', '', '666'] 

複数のスペースが並んでいる場合。使用するitem.split()

次に、ファイルオブジェクトには反復インターフェイスがあるため、次のようにファイル行を反復処理できます。

for line in open('city.dat'):
    data = line.split()
    if data[-2] == 'CITYNAME':
       count += 1
       numbers += float(data[-1])

第三に、「CITYNAME」がファイルに存在することを確認します

ファイルからの不要な読み取りや分割を防ぐために、準備したデータをメモリに保存することをお勧めします。

data = map(lambda x: x.split(), open('city.dat'))

必要に応じてフィルタリングします。

filtered_cities = filter(lambda x: x[-2] == 'CITYNAME', data)
于 2012-11-04T07:52:29.967 に答える