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

时间:2014-11-19 20:01:13

标签: python list

我有一个整数的python列表,a。我还有另一个列表b,它是2个值(c, d)的元组。我需要查看a的任何元素是否具有b的任何元组元素之间的值。

认为有一种方法可以使用map()执行此操作,但我无法弄清楚如何传递我的元组列表的值。

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

a = [1, 2, 3, 4, 5, 6, 7]
b = [(12,14), (54, 78), (2,3), (9,11)]

我试图找出a中的任何元素是否具有b的任何元组元素之间的值。在上述情况中,23(来自a)位于(2,3)中元组b的内部(包括)。所以我的最终答案是True

有没有人知道如何以格式化方式执行此操作?现在,我循环遍历a的每个元素,然后循环遍历b的每个元素。这对于少量数据是可以的,但是我的数组非常大,这一步骤需要很长时间。

3 个答案:

答案 0 :(得分:1)

如果(c,d)值限制在某个范围(比如说0-100),你可以计算一个允许值的布尔数组,并用简单的索引查找比较a。

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

答案 1 :(得分:1)

你想要这个吗?

[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

如果你想做其他事情,比如先检查使用b的每个元素中的每个元素,然后交换for s的顺序:

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

返回:

[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]

我认为这是你不想要的......但我想我会把它发给你

答案 2 :(得分:1)

如果您先排序,则可以避免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

我认为无论元组是否重叠,这都有效 - check here