Найти, если элемент находится между 2 другими элементами списка? - PullRequest
0 голосов
/ 20 апреля 2020

В одной из моих программ мне нужно определить, находится ли элемент между двумя другими, чтобы найти цены. Например, для мясника у меня есть список заказов, количество и цена. количество [5,10,15,20,25] цена [3,2.9,2.7,2.4,2.1], если, например, у меня новый заказ 7, я бы хотел интерполировать цену количества 5 и 10 и получить 2.95 (3 + 2.9 / 2) Моя проблема не в расчете цены, а в первом шаге, чтобы определить, находится ли элемент между 2 другими в моем списке.

Заранее спасибо.

Ответы [ 4 ]

0 голосов
/ 20 апреля 2020

Мое решение предполагает, что список количеств всегда находится в порядке возрастания и имеет ту же длину, что и прайс-лист.

quantity = [5, 10, 15, 20, 25]
price = [3, 2.9, 2.7, 2.4, 2.1]

# Could be quantity or price
list_length = len(quantity)

subtotal = 0

# Number you want to check
number = 7

for x in range(list_length):
    if x+1 == list_length:
        break

    if quantity[x] <= number and number <= quantity[i+1]:
        subtotal += price[x] + price[x+1]
        break

if subtotal:
    total = 2.95 * (subtotal / 2)
else:
    # Do something
    pass

0 голосов
/ 20 апреля 2020

Это функция, которая выражает один из способов сделать то, что вы просите. Вы должны добавить номер в список, прежде чем запускать его:

def is_between(lst, val):
    i = 0 # Mark number of iterations
    for lt in lst:
        if lt==val: # If the current value in the list is the one you're looking for
            try:
                assert i!=0 # Check to see if there are any values on either side of it
                lst[i+1]
            except:
                return False
            return True
        i += 1
0 голосов
/ 20 апреля 2020

Быстрый метод заключается в использовании деления пополам из Python модуля двоичного поиска

Сложность двоичного поиска составляет O (log N), где N = len (количество)

Код

from bisect import bisect_left 

def binary_search(a, x):
    if x <= a[0] or x >= a[-1]:
        return None            # outside min/max range of a

    i = bisect_left(a, x)

    return None if a[i] == x else i # a[i] == x means on bin (so not between)

Использование

q = [5,10,15,20,25]

for v in range(4, 26, 1):
    answer = binary_search(q, v)
    if answer:
        print('value {} between bins {} and {}'.format(v, answer, answer+1))
    else:
        print('value {} not between bins'.format(v))

Out

value 4 not between bins
value 5 not between bins
value 6 between bins 1 and 2
value 7 between bins 1 and 2
value 8 between bins 1 and 2
value 9 between bins 1 and 2
value 10 not between bins
value 11 between bins 2 and 3
value 12 between bins 2 and 3
value 13 between bins 2 and 3
value 14 between bins 2 and 3
value 15 not between bins
value 16 between bins 3 and 4
value 17 between bins 3 and 4
value 18 between bins 3 and 4
value 19 between bins 3 and 4
value 20 not between bins
value 21 between bins 4 and 5
value 22 between bins 4 and 5
value 23 between bins 4 and 5
value 24 between bins 4 and 5
value 25 not between bins
0 голосов
/ 20 апреля 2020

Один из подходов может быть следующим:

Если списки сохраняют свой порядок (всегда в порядке возрастания) и в обоих списках одинаковое количество элементов, вы можете преобразовать первый список в пары (кортежи) и сравнить новое число (7), если оно больше, чем первый элемент кортежа, меньше, чем второй.

data = [5,10,15,20,25]
price= [3,2.9,2.7,2.4,2.1]

tuple_list = [(x, y) for x, y in zip(data, data[1:])]
# [(5, 10), (10, 15), (15, 20), (20, 25)]

Тогда вы можете оперировать индексами кортежей: (но вы можете изменить его по своему усмотрению)

sum_to_calc = 0
new_number = 7

for x in tuple_list:
 if x[0] < new_number and x[1] > new_number:
   for index, y in enumerate(data):
     if x[0] == y or x[1] == y :
        sum_to_calc += price[index]

print(sum_to_calc/2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...