Python—将条件函数(交集)应用于列表的每个元素

Python—将条件函数(交集)应用于列表的每个元素,python,list,Python,List,我有一个int的python列表,a。我还有另一个列表,b,它是由两个值组成的元组(c,d)。我需要查看a的任何元素是否具有介于b的任何元组元素之间的值 我认为有一种方法可以使用map()实现这一点,但我不知道如何传入元组列表的值 例如,我的数据结构如下所示: a = [1, 2, 3, 4, 5, 6, 7] b = [(12,14), (54, 78), (2,3), (9,11)] 我试图找出a中的任何元素是否在b的任何元组元素之间具有值。在上述情况下,2和3(来自a)位于b中的元组(2

我有一个int的python列表,
a
。我还有另一个列表,
b
,它是由两个值组成的元组
(c,d)
。我需要查看
a
的任何元素是否具有介于
b
的任何元组元素之间的值

我认为有一种方法可以使用
map()
实现这一点,但我不知道如何传入元组列表的值

例如,我的数据结构如下所示:

a = [1, 2, 3, 4, 5, 6, 7]
b = [(12,14), (54, 78), (2,3), (9,11)]
我试图找出
a
中的任何元素是否在
b
的任何元组元素之间具有值。在上述情况下,
2
3
(来自
a
)位于
b
中的元组
(2,3)
的内部(包括内部)。因此,我的最终答案将是
True

有没有人知道如何以卓越的方式做到这一点?现在,我正在遍历
a
的每个元素,然后遍历
b
的每个元素。这对于少量数据来说是可以的,但是我的数组非常大,这一步需要很长的时间。

如果(c,d)值限制在某个范围内(比如0-100),您可以计算允许值的布尔数组,并通过简单的索引查找将a与之进行比较

如果没有限制值或范围太大,请将b的值放入排序数据结构中。然后,您可以快速查找一个列表,而无需每次查看整个列表。在构建此查找数据结构时,您必须查找重叠的范围,并将其合并。

如果(c,d)值限制在某个范围内(例如0-100),您可以计算允许值的布尔数组,并将其与简单索引查找进行比较

如果没有限制值或范围太大,请将b的值放入排序数据结构中。然后,您可以快速查找一个列表,而无需每次查看整个列表。在构建此查找数据结构时,您必须查找重叠的范围,并将其合并。

如果(c,d)值限制在某个范围内(例如0-100),您可以计算允许值的布尔数组,并将其与简单索引查找进行比较

如果没有限制值或范围太大,请将b的值放入排序数据结构中。然后,您可以快速查找一个列表,而无需每次查看整个列表。在构建此查找数据结构时,您必须查找重叠的范围,并将其合并。

如果(c,d)值限制在某个范围内(例如0-100),您可以计算允许值的布尔数组,并将其与简单索引查找进行比较

如果没有限制值或范围太大,请将b的值放入排序数据结构中。然后,您可以快速查找一个列表,而无需每次查看整个列表。在构建此查找数据结构时,您必须查找重叠的范围,并将其合并。

是否要这样做

[c in range(k[0], k[1]+1) for c in a for k in b]
返回:

[False, False, False, False,  # 1 is in any ofthe tuple range in b?
 False, False, True, False,   # 2 is in any of the tuple range in b?
 False, False, True, False,   # etc. etc....
 False, False, False, False,
 False, False, False, False,
 False, False, False, False, 
 False, False, False, False] # searches for each element in a within the range specified by the tuple elements in b
[False, False, False, False, False, False, False, // is b[0] range covers 1-7?
 False, False, False, False, False, False, False, // etc. etc. 
 False, True, True, False, False, False, False, 
 False, False, False, False, False, False, False]
如果要执行其他操作,如先使用b的每个元素检查a中的每个元素,然后将
的顺序替换为
s:

[c in range(k[0], k[1]+1) for k in b for c in a]
返回:

[False, False, False, False,  # 1 is in any ofthe tuple range in b?
 False, False, True, False,   # 2 is in any of the tuple range in b?
 False, False, True, False,   # etc. etc....
 False, False, False, False,
 False, False, False, False,
 False, False, False, False, 
 False, False, False, False] # searches for each element in a within the range specified by the tuple elements in b
[False, False, False, False, False, False, False, // is b[0] range covers 1-7?
 False, False, False, False, False, False, False, // etc. etc. 
 False, True, True, False, False, False, False, 
 False, False, False, False, False, False, False]
我以为这是你不想要的……但我想我会把它贴给你的。

你想要这个吗

[c in range(k[0], k[1]+1) for c in a for k in b]
返回:

[False, False, False, False,  # 1 is in any ofthe tuple range in b?
 False, False, True, False,   # 2 is in any of the tuple range in b?
 False, False, True, False,   # etc. etc....
 False, False, False, False,
 False, False, False, False,
 False, False, False, False, 
 False, False, False, False] # searches for each element in a within the range specified by the tuple elements in b
[False, False, False, False, False, False, False, // is b[0] range covers 1-7?
 False, False, False, False, False, False, False, // etc. etc. 
 False, True, True, False, False, False, False, 
 False, False, False, False, False, False, False]
如果要执行其他操作,如先使用b的每个元素检查a中的每个元素,然后将
的顺序替换为
s:

[c in range(k[0], k[1]+1) for k in b for c in a]
返回:

[False, False, False, False,  # 1 is in any ofthe tuple range in b?
 False, False, True, False,   # 2 is in any of the tuple range in b?
 False, False, True, False,   # etc. etc....
 False, False, False, False,
 False, False, False, False,
 False, False, False, False, 
 False, False, False, False] # searches for each element in a within the range specified by the tuple elements in b
[False, False, False, False, False, False, False, // is b[0] range covers 1-7?
 False, False, False, False, False, False, False, // etc. etc. 
 False, True, True, False, False, False, False, 
 False, False, False, False, False, False, False]
我以为这是你不想要的……但我想我会把它贴给你的。

你想要这个吗

[c in range(k[0], k[1]+1) for c in a for k in b]
返回:

[False, False, False, False,  # 1 is in any ofthe tuple range in b?
 False, False, True, False,   # 2 is in any of the tuple range in b?
 False, False, True, False,   # etc. etc....
 False, False, False, False,
 False, False, False, False,
 False, False, False, False, 
 False, False, False, False] # searches for each element in a within the range specified by the tuple elements in b
[False, False, False, False, False, False, False, // is b[0] range covers 1-7?
 False, False, False, False, False, False, False, // etc. etc. 
 False, True, True, False, False, False, False, 
 False, False, False, False, False, False, False]
如果要执行其他操作,如先使用b的每个元素检查a中的每个元素,然后将
的顺序替换为
s:

[c in range(k[0], k[1]+1) for k in b for c in a]
返回:

[False, False, False, False,  # 1 is in any ofthe tuple range in b?
 False, False, True, False,   # 2 is in any of the tuple range in b?
 False, False, True, False,   # etc. etc....
 False, False, False, False,
 False, False, False, False,
 False, False, False, False, 
 False, False, False, False] # searches for each element in a within the range specified by the tuple elements in b
[False, False, False, False, False, False, False, // is b[0] range covers 1-7?
 False, False, False, False, False, False, False, // etc. etc. 
 False, True, True, False, False, False, False, 
 False, False, False, False, False, False, False]
我以为这是你不想要的……但我想我会把它贴给你的。

你想要这个吗

[c in range(k[0], k[1]+1) for c in a for k in b]
返回:

[False, False, False, False,  # 1 is in any ofthe tuple range in b?
 False, False, True, False,   # 2 is in any of the tuple range in b?
 False, False, True, False,   # etc. etc....
 False, False, False, False,
 False, False, False, False,
 False, False, False, False, 
 False, False, False, False] # searches for each element in a within the range specified by the tuple elements in b
[False, False, False, False, False, False, False, // is b[0] range covers 1-7?
 False, False, False, False, False, False, False, // etc. etc. 
 False, True, True, False, False, False, False, 
 False, False, False, False, False, False, False]
如果要执行其他操作,如先使用b的每个元素检查a中的每个元素,然后将
的顺序替换为
s:

[c in range(k[0], k[1]+1) for k in b for c in a]
返回:

[False, False, False, False,  # 1 is in any ofthe tuple range in b?
 False, False, True, False,   # 2 is in any of the tuple range in b?
 False, False, True, False,   # etc. etc....
 False, False, False, False,
 False, False, False, False,
 False, False, False, False, 
 False, False, False, False] # searches for each element in a within the range specified by the tuple elements in b
[False, False, False, False, False, False, False, // is b[0] range covers 1-7?
 False, False, False, False, False, False, False, // etc. etc. 
 False, True, True, False, False, False, False, 
 False, False, False, False, False, False, False]

我想这是你不想要的……但我想我还是会把它贴给你的

如果你先排序,你可以避免检查
a
中的每个值和
b
中的每个元组。可以丢弃已根据较低的
a
值检查的元组,这将使检查速度更快

def check_value_in_ranges(a, b):
    a = sorted(set(a))
    b = sorted(set(b), reverse=True)
    lower, upper = b.pop()
    for value in a:
        while value >= lower:
            if value <= upper:
                return True
            elif not b:                
                return False           # no tuples left to check against
            lower, upper = b.pop()     
    return False                       # no values of a left to check
def检查范围(a、b)中的值:
a=已排序(集合(a))
b=已排序(设置(b),反向=真)
下部,上部=b.pop()
对于a中的值:
当值>=较低时:

如果值如果先排序,则可以避免将
a
中的每个值与
b
中的每个元组进行检查。可以丢弃已根据较低的
a
值检查的元组,这将使检查速度更快

def check_value_in_ranges(a, b):
    a = sorted(set(a))
    b = sorted(set(b), reverse=True)
    lower, upper = b.pop()
    for value in a:
        while value >= lower:
            if value <= upper:
                return True
            elif not b:                
                return False           # no tuples left to check against
            lower, upper = b.pop()     
    return False                       # no values of a left to check
def检查范围(a、b)中的值:
a=已排序(集合(a))
b=已排序(设置(b),反向=真)
下部,上部=b.pop()
对于a中的值:
当值>=较低时:

如果值如果先排序,则可以避免将
a
中的每个值与
b
中的每个元组进行检查。可以丢弃已根据较低的
a
值检查的元组,这将使检查速度更快

def check_value_in_ranges(a, b):
    a = sorted(set(a))
    b = sorted(set(b), reverse=True)
    lower, upper = b.pop()
    for value in a:
        while value >= lower:
            if value <= upper:
                return True
            elif not b:                
                return False           # no tuples left to check against
            lower, upper = b.pop()     
    return False                       # no values of a left to check
def检查范围(a、b)中的值:
a=已排序(集合(a))
b=已排序(设置(b),反向=真)
下部,上部=b.pop()
对于a中的值:
当值>=较低时:

如果值如果先排序,则可以避免将
a
中的每个值与
b
中的每个元组进行检查。可以丢弃已根据
a
的较低值进行检查的元组,这将使t