我有一个整数的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
的任何元组元素之间的值。在上述情况中,2
和3
(来自a
)位于(2,3)
中元组b
的内部(包括)。所以我的最终答案是True
。
有没有人知道如何以格式化方式执行此操作?现在,我循环遍历a
的每个元素,然后循环遍历b
的每个元素。这对于少量数据是可以的,但是我的数组非常大,这一步骤需要很长时间。
答案 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。