Зачем указывать диапазон индекса, чтобы написать список цикла while в Python? - PullRequest
0 голосов
/ 28 сентября 2018
mean_temp.txt = 
city,country,month ave: highest high,month ave: lowest low
    Beijing,China,30.9,-8.4
    Cairo,Egypt,34.7,1.2
    London,UK,23.5,2.1
    Nairobi,Kenya,26.3,10.5
    New York City,USA,28.9,-2.8
    Sydney,Australia,26.5,8.7
    Tokyo,Japan,30.8,0.9

mean_temp = open('mean_temp.txt', 'r')
city_temp = mean_temp.readline().split(",") 

while city_temp[0]: 
    print(city_temp[0], city_temp[2]) 
    city_temp = mean_temp.readline().split(",")

mean_temp.close()

Задача состоит в том, чтобы просто напечатать самую высокую температуру для каждого города (например, Пекин, 30,9).

Моя первая попытка решить эту проблему состояла в том, чтобы просто написать цикл while как "while city_temp: "Я до сих пор не совсем понимаю, почему мне нужно указывать индекс для цикла while, чтобы не сделать ошибку «вне индекса».Почему мне нужно написать "while city_temp[0]:"?Я думал, что цикл while естественным образом закончится, как только он достигнет конца списка ... :( Буду рад и благодарен за помощь, спасибо!

Ответы [ 4 ]

0 голосов
/ 28 сентября 2018

[0], который вы используете, не является индексом строки в файле, это индекс первого элемента кортежа, который вы получаете, разбивая одну строку на запятые.Причина, по которой вы проверяете этот элемент, заключается в распознавании, когда больше нет строк.

Более простой и идиоматический подход будет выглядеть так:

with open('file.csv') as csvDataFile:
    csvReader = csv.reader(csvDataFile)
    for row in csvReader:
        # do something with row
0 голосов
/ 28 сентября 2018

Потому что, когда вы достигнете конца вашего файла, mean_temp.readline() вернет пустую строку, ''.Когда вы вызываете split для пустой строки:

>>> ''.split(',')
['']

Возвращает список с пустой строкой, который равен truey

>>> bool(''.split(','))
True

Однако выне должен использовать цикл while вообще.Вместо этого используйте цикл for:

for line in mean_temp:
    # do stuff with line...
0 голосов
/ 28 сентября 2018

Это так, что цикл while завершится, когда достигнет конца файла, при этом readline() вернет '' и разделится на [''] с split(','), после чего индекс 0 равно '' и оценивается как False, поэтому цикл while заканчивается.

Если вы хотите, чтобы цикл заканчивался более «естественно» в конце файла, рекомендуется использоватьфайловый объект в качестве итератора, поэтому вы можете использовать цикл for для его итерации:

with open('mean_temp.txt', 'r') as mean_temp:
    for line in mean_temp:
        city, _, temp = line.split(',')
        print(city, temp)
0 голосов
/ 28 сентября 2018

Поскольку у него всегда будет элемент '' в конце цикла, поэтому после разделения у него не будет третьего (второго элемента) в списке (именно это и делает ошибку), только одинэлемент там, который является [''].

Так что вы должны сделать [0], чтобы также проверить первый (нулевой) элемент для подготовки, если он пустой, в основном, если он пустой, bool(city_temp) будетFalse затем он выходит из цикла

Обратите внимание, что [''] по-прежнему True, поскольку он содержит элемент

Лучший код, работает только на питоне 3:

with open('mean_temp.txt', 'r') as f:
   for i in f:
      print(' '.join(i.split(',')[::3]),end='')
print()

Если в верхней части кода вы не напишите from __future__ import print_function, тогда он будет работать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...