Python: удаление следующих элементов на основе суммы предыдущего элемента в списке кортежей - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть три примера входных списков кортежей:

bc_lst = [(639, 16), (653, 25), (734, 33), (768, 50), (777, 16), (827, 42), (854, 24), (867, 63), (869, 48), (877, 26), (903, 26), (927, 26), (929, 22), (949, 20), (969, 20), (990, 19), (999, 23), (1010, 19), (1030, 20), (1042, 63), (1049, 20), (1069, 17), (1143, 18), (1158, 18), (1174, 25)]

uc_lst = [(1215, 25), (1293, 25), (1317, 29), (1327, 43), (1346, 26), (1374, 26), (1400, 21), (1420, 21), (1430, 102), (1443, 20), (1465, 19), (1486, 20), (1506, 21), (1528, 20), (1549, 20), (1570, 20), (1591, 20), (1612, 16), (1621, 26), (1632, 21), (1639, 26), (1653, 21)]

dt_lst = [(1566, 39), (1609, 24), (1620, 20), (1650, 38), (1658, 20), (1691, 37), (1701, 20), (1732, 38), (1772, 16), (1785, 19), (1814, 36), (1854, 37), (1854, 38), (1861, 19)]

и буферная переменная buf = 5.Я хочу сделать эту операцию для bc_lst, uc_lst и dt_lst: проверьте по первому элементу, меньше ли сумма кортежа, чем сумма первого элемента следующего кортежа и буфера, затем удалитеследующий элемент из списка и проверьте следующий элемент списка.

Рассмотрим bc_lst.Сумма первого кортежа составляет 655 и 653+5 > 655, поэтому мы сохраняем (653,25).Теперь проверьте, является ли 734 +5 > 653+25, то есть True, поэтому оставьте (734,33).Теперь отметьте 768 +5 > 734+33, что опять равно True, поэтому мы проверяем следующий элемент, но 777 +5 > 768+50 равно False, поэтому мы отбрасываем кортеж (777,16).Теперь мы снова проверяем, если 827+5 > 768+50, что True, поэтому мы сохраняем (827,42).Процесс продолжается.

Это код, который я пробовал:

def func1(a1):
    count = 0
    while count < len(a1)-1:
        if a1[count+1][0] + buf < sum(a1[count]):
            del a1[count+1]
        count +=1
func1(bc_lst)

Вывод, который я получаю для bc_lst:

[(639, 16), (653, 25), (734, 33), (768, 50), (827, 42), (867, 63), (877, 26), (903, 26), (927, 26), (949, 20), (969, 20), (990, 19), (1010, 19), (1030, 20), (1049, 20), (1069, 17), (1143, 18), (1158, 18), (1174, 25)]

, для uc_lst вывод:

[(1215, 25), (1293, 25), (1317, 29), (1346, 26), (1374, 26), (1400, 21), (1420, 21), (1443, 20), (1465, 19), (1486, 20), (1506, 21), (1528, 20), (1549, 20), (1570, 20), (1591, 20), (1612, 16), (1632, 21), (1653, 21)]

, для dt_lst вывод:

[(1566, 39), (1609, 24), (1650, 38), (1691, 37), (1732, 38), (1772, 16), (1785, 19), (1814, 36), (1854, 37), (1861, 19)]

Принимая во внимание, что желаемый вывод для bc_lst равен:

[(639, 16), (653, 25), (734, 33), (768, 50), (827, 42), (867, 63), (927, 26), (949, 20), (969, 20), (990, 19), (1010, 19), (1030, 20), (1049, 20), (1069, 17), (1143, 18), (1158, 18), (1174, 25)]

, желаемыйвывод для uc_lst совпадает с выводом, который я получаю, а желаемый вывод для dt_lst:

[(1566, 39), (1609, 24), (1650, 38), (1691, 37), (1732, 38), (1772, 16), (1814, 36), (1854, 37)]

Что не так в коде?

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

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

Например, у вас будет функция с вводом в виде списка, который вы хотите обработать, буфер и индекс текущего элемента обработки, например:

def process_list_element(list, current_index, buffer):
    if list[current_index + 1][0] + buf < sum(list[current_index]):
        del list[current_index+ 1]
    else:
        current_index += 1
    return list, current_index

* Пожалуйста, посмотрите внимательно, это просто псевдокод, чтобы продемонстрировать подход

А затем просто повторите

index = 0
buffer = 5
while index < len(list) -1:
    list, index = process_list_element(list, index, buffer)
0 голосов
/ 28 февраля 2019

Мне кажется, проблема в том, что если вы удаляете элемент, вы не хотите увеличивать счетчик.

buf=5

def func1(a1):
    count = 0
    while count < len(a1) - 1:
        if a1[count + 1][0] + buf < sum(a1[count]):
            del a1[count + 1]
        else:
            count += 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...