Python — удаление элементов в списке списков

#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, записываются, но не изменяют публично отображаемый результат публикации «. У меня низкая репутация: ( В любом случае спасибо за помощь!