Обновление значения в Python

#python #arrays #csv #dictionary

#python #массивы #csv #словарь

Вопрос:

Здравствуйте, я пытаюсь написать программу, которая считывает CSV-файл разных животных разных пород. Различные животные, названные по-разному, могут принадлежать к одной и той же породе. (Представьте двух кошек по имени Боб и Сэм)

Породы находятся в одном столбце, а имена — в другом.

Я хочу иметь возможность просмотреть всех животных и подсчитать количество животных в каждой породе.

Код, который у меня есть до сих пор, выглядит следующим образом:

 dragon = open('dragons.csv')

breed = {}

for line in dragon:
    row = line.strip().split(',')
    if row[4] in breed.keys():

else:
    breed[row[4]] = 1 #The Breed is in the fourth column
  

Как я могу это сделать?

Спасибо!

Комментарии:

1. Также в строке «else:» выдается ошибка «ожидаемый блок с отступом», которую я не понимаю

2. Ваш else оператор должен быть на том же уровне, if что и . В настоящее время он стоит отдельно без if того же уровня, поэтому он ожидал отступа.

3. Вы должны поместить тот же отступ в else и if . Таким образом, добавьте отступ

4. у вас проблема с отступом. сделайте правильный отступ в коде

5. @kmario23 Я только что понял, что я идиот! 😛

Ответ №1:

Как указывают комментарии, отступы имеют значение в python. else Не на том же уровне отступа, что и, if и, таким образом, вы получаете ошибку.

что касается подсчета, = оператор полезен для этого, поэтому ваш блок if / else может быть таким:

 if row[4] in breed.keys():
    breed[row[4]]  = 1
else:
    breed[row[4]] = 1
  

Комментарии:

1. Большое вам спасибо! Действительно ценю это.

Ответ №2:

Ваш else блок имеет недостаточный отступ ( else может быть сопряжен с for , но это редко, и логика вашего кода говорит, что здесь ошибка).

Даже если вы это исправите, у вас не может быть пустого блока в Python, потому что Python требуется хотя бы одна строка кода с отступом для определения уровня отступа блока (чтобы он мог определять, когда блок заканчивается). Когда вы не предоставляете никакого тела для блока (немедленно запустите новый блок или завершите внешний блок перед предоставлением тела), вы получаете ошибку «ожидаемый блок с отступом», о которой вы упоминаете. Таким образом, вы можете использовать pass (ключевое слово no-op, которое означает «Вот что-то, что нужно поместить в блок, который ничего не делает):

 if row[4] in breed:  # Don't call .keys(); much slower on Py2, a little slower on Py3
    pass
else:
    breed[row[4]] = 1 #The Breed is in the fourth column
  

Или просто инвертируйте if тест для управления else блоком, чтобы вам не нужны были оба:

 if row[4] not in breed:
    breed[row[4]] = 1 #The Breed is in the fourth column