Проверьте, находятся ли элементы диапазона в списке списков - PullRequest
2 голосов
/ 11 июня 2019

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

>>>  n= [10, 20, 30, 40]
>>>  m= [[1, 20], [21, 30]]

Я пытаюсь проверить, находятся ли все элементы списка n в пределах одного из существующих диапазонов в m или нет. Например, из приведенного выше примера 40 не входит ни в один из диапазонов.

Я попытался расширить ответ на вопрос в следующем посте, но, похоже, он не работает.

Проверка, все ли элементы списка списков находятся в другом списке списков Python

is_there = set(tuple(x) for x in [n]).issubset(tuple(x) for x in m)

Ответы [ 3 ]

5 голосов
/ 11 июня 2019

Вы должны пройти через каждый элемент в n и проверить, находится ли он в диапазоне каждого списка m. Предполагая, что вы работаете только с целыми:

[any(x in range(r[0], r[1]) for r in m) for x in n]

Если вы хотите включить конец диапазона, просто добавьте 1:

[any(x in range(r[0], r[1]+1) for r in m) for x in n]
3 голосов
/ 11 июня 2019

Простой подход - проверить все элементы:

items = [10, 20, 30, 40]
ranges = [[1, 20], [21, 30]]

result = all(any(low <= i <= high for low, high in ranges) for i in items)

Ради интереса, вы можете сделать проверку содержимого немного другой, используя range объекты:

range_objects = [range(low, high + 1) for low, high in ranges]
filtered_items = all(any(i in r for r in range_objects) for i in items)

Если вы хотите получить соответствующие предметы:

good = [i for i in items if any(low <= i <= high for low, high in ranges)]

Вместо этого вы также можете получить плохие элементы:

bad = [i for i in items if all(i < low or i > high for low, high in ranges)]

Таким образом, ваш первоначальный результат просто not bad.

1 голос
/ 11 июня 2019

Поскольку вы сказали, "отсортированный список" , вы можете использовать следующую логику min и max. outside будет True, если какой-либо из элементов в n будет выходить за пределы указанных диапазонов. Это будет False, если ни один из элементов не выходит за пределы диапазона

n= [10, 20, 30, 40] # < as per you, this is sorted
m= [[1,20], [21,30]]

outside = any([(min(n) < i[0] and max(n)> i[1]) for i in m])
# True

Редактировать Ответ на контрольный пример, заданный @Peter DeGlopper в комментарии ниже

m = [[1, 20], [31, 40]]
n = [10, 20, 25, 30, 40]
outside = any([(l < i < r for i in n) for l, r in m])
# True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...