[英]How to check if the elements within a list of lists have overlapping numerical values
[英]Check if the elements of a range are within a list of lists
我有一個排序列表,一個范圍包含多個列表:
>>> n= [10, 20, 30, 40]
>>> m= [[1, 20], [21, 30]]
我想要做的是檢查n
列表中的所有元素是否都在m
的現有范圍內。 例如,從上面的例子中,40不在任何范圍內。
我試着在下面的帖子中擴展問題的答案,但似乎它不起作用。
is_there = set(tuple(x) for x in [n]).issubset(tuple(x) for x in m)
你應該遍歷n
每個元素,並檢查它是否在每個m
列表的范圍內。 假設您只使用int:
[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]
簡單的方法是檢查所有元素:
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
。
既然你說“排序列表” ,你可以使用min
和max
的以下邏輯。 如果n
任何元素超出給定范圍,則outside
將為True
。 如果沒有元素超出范圍,則為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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.