[英]Python - Apply an conditional function (intersection) to every element of a 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
任何元組元素之間是否具有值。 在上述情況下, 2
和3
(來自a
(2,3)
位於b
中的元組(2,3)
內部(包括)。 所以,我最后的答案會是True
。
有誰知道如何以一種高性能的方式做到這一點? 現在,我遍歷a
每個元素,然后遍歷b
每個元素。 這對於少量數據是可以的,但是我的數組很大,這一步要花很長時間。
如果(c,d)值限制在某個范圍內(例如0-100),則可以計算一個允許值的布爾數組,然后使用簡單的索引查找將a與該值進行比較。
如果您的值不受限制或范圍太大,則將b的值放入已排序的數據結構中。 然后,您可以快速查找a,而不必每次都遍歷整個列表。 建立此查找數據結構時,您必須注意重疊范圍,然后合並它們。
dId您想要這個嗎?
[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的每個元素檢查a中的每個元素,然后交換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]
我以為這是您不想要的....但以為我還是會把它發布給您
如果您首先進行排序,則可以避免對照b
中的每個元組檢查a
中的每個值。 這已經核對過的較低值的元組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
我認為無論元組是否重疊,這都行得通- 在這里檢查 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.