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

Рейтинг: 0Ответов: 2Опубликовано: 08.07.2023

Пример итогового результата

Есть два списка. Один короткий, а второй длинный и в нем числа располагаются между значениями первого. Хочу сделать третий список, той же длинны что и второй(длинный), но в нем будут располагаться значения из первого, но с выполнением условий. То есть если в первом списке идет к примеру 230,240,250, то 230 будет стоять напротив 231, 236, 238, до тех пор пока во втором не появится 240+. Проблема усложняется тем, что я пишу телеграм-бота на Python и хочу сделать так чтобы программа работала с пользовательским вводом, чтобы можно было скопировать столбик чисел из Excel и вставить в telegram(средствами Excel не придумал как сделать),но из-за недостатка знаний кроме всего прочего мне кажется имеется проблема приведения типов

import telebot
import config
bot = telebot.TeleBot(config.CALC_BOT_TOKEN)

@bot.message_handler(commands=['start'])
def getMessageLoc(message):
    numvan = bot.send_message(message.chat.id, 'Вставить короткий список')
    bot.register_next_step_handler(numvan, num1_fun)

def num1_fun(message):
    global num1;
    num1 = message.text
    numtwo = bot.send_message(message.chat.id, 'Вставить длинный список')
    bot.register_next_step_handler(numtwo, num2_fun)

def num2_fun(message):
    global num2;
    num2 = message.text
    calcu = bot.send_message(message.chat.id, 'Отправь "1" в чат для запуска')
    bot.register_next_step_handler(calcu, calc1)

def calc1(message):
    global calc;
    calc = message.text
    global list1;
    list1 = num1.split()  #Делю текст на отдельные элементы списка
    global list2;
    list2 = num2.split()
    global list3;

    list1 = [a for a in range(len(list1))]    #Делаю массивы из данных
    list2 = [b for b in range(len(list2))]
    list3 = [c for c in range(len(list1))]

    # list1 - длинный список
    # list2 - короткий список
    # list3 - итоговый список


    for i in range (1, len(list1)):
        if list2[i] < list1[i]:
            list3.append(list1[i])
            list1[i] = list1[i+1]
        else:
            list2[i] = list2[i+1]
        return list3

    #Вывожу новый список в виде сообщения
    bot.send_message(message.chat.id, list3) 


bot.polling(none_stop=True)

А проблема заключается в том, что либо ничего не выводится, либо индекс короткого списка (list2) выходит за пределы

Ответы

▲ 1

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

def calc(a, b):
    c = []
    ia = 0
    ib = 0
    for ib in range(len(b)):
        while ia < len(a)-1 and a[ia+1] < b[ib]:
            ia += 1
        c.append(a[ia])
    return c

a = [10, 20, 30]
b = [4, 11, 13, 15, 23, 27, 36]
print(calc(a, b))

[10, 10, 10, 10, 20, 20, 30]
▲ 0

Если я вас правильно понял то возможно zip_longest вам поможет.

from itertools import zip_longest

a = (1, 2, 3, 4)
b = (2, 3, 3, 4, 5)

print(list(zip_longest(a, b, fillvalue=0)))
# [(1, 2), (2, 3), (3, 3), (4, 4), (0, 5)]