Не понимаю, как сложить элементы в учебной задаче Python
Проблема такая, требуется достать все цены на товары, сложить их и разделить на их количество (узнать среднюю цену). Я не могу понять, как числа привести к int (вроде сделал, но не уверен, что это правильно) и сложить между собой.
from bs4 import BeautifulSoup
price_html = """
<table cellspacing="0" cellpadding="0" border="1">
<tbody>
<tr class="even_row">
<th><p>№ п/п</p></th>
<th class="armor"><p>Название</p></th>
<th class="price"><p>Цена</p><p>рублей</p></th>
</tr>
<tr class="odd_row">
<td><p>1.</p></td>
<td class="armor"><p>Щит</p></td>
<td class="price"><p>375</p></td>
</tr>
<tr class="even_row">
<td><p>2.</p></td>
<td class="armor"><p>Шлем</p></td>
<td class="price"><p>297</p></td>
</tr>
<tr class="odd_row">
<td><p>3.</p></td>
<td class="armor"><p>Кольчуга</p></td>
<td class="price"><p>565</p></td>
</tr>
<tr class="even_row">
<td><p>4.</p></td>
<td class="armor"><p>Булава</p></td>
<td class="price"><p>1992</p></td>
</tr>
<!-- Сюда может добавиться неизвестное количество элементов экипировки.
Их тоже нужно учитывать при расчёте средней цены. -->
</tbody>
</table>
"""
soup = BeautifulSoup(price_html, 'lxml')
result = soup.find_all('td', attrs={'class': 'price'})
length = len(result)
y = []
y = list(map(int, y))
for i in result:
y.append(i.text)
# print(result)
# print('Средняя цена богатырских доспехов: ', result, 'рублей')
Ответы (2 шт):
Нашел такое решение:
soup = BeautifulSoup(price_html, 'lxml')
result = soup.find_all('td', attrs={'class': 'price'})
length = len(result)
y = []
for i in result:
y.append(i.text)
y = [int(item) for item in y]
final = sum(y)/length
# print(sum(y))
print('Средняя цена богатырских доспехов: ', final, 'рублей')
Знакомая «Ошибка молотка» («Ошибка XY», XY Problem):
Вы не хотите сложить элементы, вы хотите их среднее значение.
Вы можете применить функцию mean() из стандартного модуля statistics:
import statistics
statistics.mean(y)
или нагляднее, но менее рекомендуемое
from statistics import mean
mean(y)
Я не могу понять, как числа привести к int (вроде сделал, но не уверен, что это правильно)
В вашем коде нужно немножко изменить порядок этих 3 команд с
y = list(map(int, y))
for i in result:
y.append(i.text)
на
for i in result:
y.append(i.text)
y = list(map(int, y))
чтобы перевод в тип int выполнился только после полного заполнения списка.
Затем:
import statistics
avg = statistics.mean(y)
print('Средняя цена богатырских доспехов: ', avg, 'рублей')
Примечание:
Для Питона 3.6+ лучше применить f-строку:
print(f'Средняя цена богатырских доспехов: {avg:.2f} рублей')
Это красивее и результат будет всегда изображен с 2 десятичными цифрами (правильно округленный).