簡體   English   中英

Python-將條件函數(交集)應用於列表的每個元素

[英]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任何元組元素之間是否具有值。 在上述情況下, 23 (來自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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM