Как проверить, существует ли значение в списке с разделением строк внутри элементов - PullRequest
0 голосов
/ 23 октября 2018

Мне нужно проверить, существует ли значение (например, 13 или 17.5) в диапазонах, определенных в списке строк, таких как:

L = ["12-14", "15-16", "17-20"]

Например, диапазоны будут 12 до 14 включительно, 15 до 16 и т. д.

Я бы хотел:

if "13.5" in L:
    print("yes")
else:
    print("no")

Ожидаемый результат: yes

Как можноЯ делаю это?

Ответы [ 4 ]

0 голосов
/ 23 октября 2018

Создать список кортежей для удобного поиска

L = ["12-14", "15-16", "17-20"]
L_tup=[tuple(map(int,k.split('-'))) for k in L]
num=13
for i in L_tup:
    if i[0] < num <i[1]:
        print('yes')
        break
    else:
        print('no')
0 голосов
/ 23 октября 2018

Предполагая, что элементы в списке представляют диапазоны, вы можете попробовать что-то вроде этого:

def check(x, ranges_list):
    x = float(x)
    for s in ranges_list:
        start, end = s.split('-')
        if float(start) <= x <= float(end):
            return True

    return False

my_ranges = ["12-14", "15-16", "17-20"]
if check('13.5', my_ranges):
    print('yes')
else:
    print('no')

Obs: это предполагает, что все числа могут быть преобразованы в float.

0 голосов
/ 23 октября 2018

Строковое представление немного грубое, как насчет простого класса MyRange, где вы можете просто выдать x in m для числа x и экземпляра m из MyRange?

>>> class MyRange:
...:    def __init__(self, start, end):
...:        self.start = start
...:        self.end = end
...:    def __contains__(self, x):
...:        return self.start <= x <= self.end
...:    def __repr__(self):
...:        return '{}({!r}, {!r})'.format(type(self).__name__, self.start, self.end)
>>> 
>>> lst = ["12-14", "15-16", "17-20"]
>>> 
>>> my_ranges = [MyRange(*map(float, s.split('-'))) for s in lst]
>>> my_ranges
>>> [MyRange(12.0, 14.0), MyRange(15.0, 16.0), MyRange(17.0, 20.0)]
>>> 
>>> any(13.5 in r for r in my_ranges)
>>> True
>>> any(11.7 in r for r in my_ranges)
>>> False
>>> any(17.5 in r for r in my_ranges)
>>> True

Проверка __contains__ завершается успешно, если x равен конечным точкам, вы можете изменить это поведение, используя < вместо <=.

0 голосов
/ 23 октября 2018

Использование .split(), а затем сравнение с элементами в списке с использованием any

lst = ["12-14", "15-16", "17-20"]

if any(int(i.split('-')[0]) < 13.5 < int(i.split('-')[1]) for i in lst):
    print('yes')
else:
    print('no')
# yes
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...