#python #for-loop #if-statement #nested-lists
#python #для цикла #if-оператор #вложенные списки
Вопрос:
Пытаюсь изучить Python и получил эту задачу, чтобы выяснить, есть ли последовательное улучшение по сравнению с предыдущим годом (более высокий балл) с 2003-2018 для любой из стран.
Данный список:
lst=[[;2018;2015;2012;2009;2006;2003],[Country1;558;544;538;525;525;527],[Country2;551;548;561;555;547;550],[Country3;545;538;536;534;533;529],[Country4;526;524;554;546;547;542]]
Список намного длиннее, чем образец. Страны с улучшением эффективности за год должны быть представлены в таблице. Вторая задача — сделать то же самое, но для стран с более низким показателем по сравнению с прошлым годом.
Импорт не разрешен.
Я думаю, что мне нужно выполнить несколько поисков if в цикле for, но на самом деле я рисую пробел. Я действительно не могу понять это.
Приветствуются любые советы по стратегии или примеры кода.
Комментарии:
1. Каковы именно ваши критерии? Должно ли быть хотя бы одно улучшение за год? прошлый год лучше, чем первый? Всегда должно улучшаться с каждым годом?
2. Критерием является то, что он должен улучшаться с каждым годом.
Ответ №1:
Для начала я бы использовал различия между каждым годом, например
lst=[[2018,2015,2012,2009,2006,2003],["Country1",558,544,538,525,525,527],["Country2",551,548,561,555,547,550],["Country3",545,538,536,534,533,529],["Country4",526,524,554,546,547,542]]
for list in lst[1:]:
nums = list[1:]
print([nextnum - num for num, nextnum in zip(nums, nums[1:])])
Затем вы можете выполнить простую проверку цикла, в котором различия остаются положительными / отрицательными
Комментарии:
1. Попробовал ваше решение, но получил запутанный ответ. [-14, -6, -13, 0, 2] [-3, 13, -6, -8, 3] [-7, -2, -2, -1, -4] [-2, 30, -8, 1, -5] Первый список (годы)начинается с одинарных кавычек, [«, ‘2018’, ‘2015’, ‘2012’, ‘2009’, ‘2006’, ‘2003’].
Ответ №2:
Я не уверен, как вы хотите представить это в виде таблицы, но для вычисления YoY вы можете сделать это следующим образом:
def yoy(y1, y2):
return (y2 - y1) / y1
А затем примените его к своему списку, чтобы узнать, какие страны улучшались год от года:
for row in lst[1:]:
# calculate YoY
country_yoys = []
for y1, y2 in zip(row[1:], row[2:]):
gain = yoy(y1, y2)
country_yoys.append(gain)
# Check if each YoY has an improvement
counsecutive_yoy_improv = all(sum(country_yoys[i:i 2]) > 0 for i in range(1, len(country_yoys) 1))
# Print results
if counsecutive_yoy_improv:
print(f"Country "{row[0]}" has been doing good!")
else:
print(f"Country "{row[0]}" has been doing bad!")
Ответ №3:
Попробуйте это.
lst = [
['',2018,2015,2012,2009,2006,2003],
["Country1",558,544,538,525,525,524],
["Country2",551,548,561,555,547,550],
["Country3",545,538,536,534,533,529],
["Country4",526,524,554,546,547,542]
]
_, *year_data = lst.pop(0)
countries = lst
def is_decreasing(lst) -> bool:
last_checked, *rest = lst
for year_data in rest:
if year_data < last_checked:
last_checked = year_data
else:
return False
return True
def is_increasing(lst) -> bool:
last_checked, *rest = lst
for year_data in rest:
if year_data > last_checked:
last_checked = year_data
else:
return False
return True
def find_yoy():
increasing_yoy = []
decreasing_yoy = []
for country in countries:
country_name, *country_data = country
assert len(year_data) == len(country_data)
sorted_year_data, sorted_country_data = zip(*sorted(zip(year_data, country_data)))
if is_increasing(sorted_country_data):
increasing_yoy.append(country_name)
elif is_decreasing(sorted_country_data):
decreasing_yoy.append(country_name)
print("countries with increasing yoy:", ', '.join(increasing_yoy), '.')
print("countries with decreasing yoy:", ','.join(decreasing_yoy), '.')
find_yoy()
Если важна производительность, объедините is_decreasing
и is_increasing
в одну функцию.
Комментарии:
1. Приветствия, но мне не разрешено использовать какой-либо импорт.
2. lol это просто статическая типизация для вашей IDE, удалите ее, если хотите
3. Протестировано, работает! Но… Страна1 не имеет последовательного увеличения, в период с 2006 по 2009 год она увеличивается с 525 до 525, поэтому она должна быть false . Изменено с >= на только>, но это не дает мне увеличения в годовом исчислении для Country3, как и должно быть. Странно. Почему?
4. О, была небольшая ошибка. Я перебирал
lst
вместоrest
. Пожалуйста, примите этот ответ, если он решил вашу проблему.5. Это произошло! Я принял ваш ответ, но получил это: «Спасибо за отзыв! Голоса, поданные лицами с репутацией менее 15, записываются, но не изменяют публично отображаемый результат публикации «. У меня низкая репутация: ( В любом случае спасибо за помощь!