Вы можете просто использовать генератор, чтобы получить результат:
l1 = [0,1000,5000,10000,20000,30000,40000,50000]
v2 = ['a','b','c','d','e','f','g']
value = 1111
result = next((v for v, i, j in zip(v2, l1[:-1], l1[1:]) if value in range(i, j)), None)
Вывод:
>>> result
'b'
Добавив значение по умолчанию None
в качестве второго аргумента next()
,Вы также можете обрабатывать случаи, когда они не найдены:
value = -50
result = next((v for v, i, j in zip(v2, l1[:-1], l1[1:]) if value in range(i, j)), None)
>>> result
# None
Если вы просто хотели индекс, вместо него можно использовать enumerate
:
result = next((v for v, (i, j) in enumerate(zip(l1[:-1], l1[1:])) if value in range(i, j)), None)
>>> result
# 1
Объяснение:
Строка результата состоит из нескольких частей:
next(iterator [, default])
Это функция для получения следующего элемента в iterator
, переданном в аргументе. default
служит для возврата значения по умолчанию, если встречается StopIteration
. Рассматриваемый iterator
является здесь генератором (для ясности разбит):
(
v # point 4
for v, i, j # point 2
in zip(v2, l1[:-1], l1[1:]) # point 1
if value in range(i, j) # point 3
)
Функция zip
объединяет переданные lists
, так что v2[0]
, l1[:-1][0]
и l1[1:][0]
формируются в кортеж ('a', 0, 1000)
и т. Д. Для каждого индекса.
for v, i, j
служит для извлечения элементов в кортеже.
if value in range(i, j)
служит для проверки того, что 1111
находится в диапазоне между range(0, 1000)
.
Если это совпадение, возвращается v
. Если нет, переходите к следующей итерации.