[英]Finding overlapping numbers in a tuple in python
我正在做一個NLP項目,並且我有一些字符跨度的列表。 該列表可能如下所示:
[(1,4),(1,7),(4,9),(8,15)]
因此,我的任務是返回所有非重疊對。 如果兩個或更多數字對重疊,則應返回跨度最長的數字對。 在我的示例中,我想返回[(1,7),(8,15)]
。 我怎樣才能做到這一點?
編輯
我不想像這里的“合並重疊”中那樣合並我的間隔。 但是我不會返回所有對/間隔/元組,除非某些元組中的值重疊。 例如(1,4)和(1,7)重疊,(4,9)與(1,4)和(1,7)重疊。 如果有一些重疊,我想返回具有最大跨度的元組,例如(1,7)=跨度7,(1,4)=跨度4,(4,9)=跨度5。這意味着它應該返回( 1,7)和(8,15),因為(8,15)不重疊(1,7)
沒想太多,但是以下方法可以解決問題:
spans = [(1,4),(1,7),(4,9),(8,15)]
del_in = []
for x in spans:
if spans.index(x) in del_in: continue
for y in spans:
if spans.index(y) in del_in: continue
if x == y: continue
if len(set(list(range(x[0],x[1]+1))) & set(list(range(y[0],y[1]+1)))) > 0:
if len(list(range(x[0],x[1]+1))) > len(list(range(y[0],y[1]+1))):
del_in.append(spans.index(y))
spans.pop(spans.index(y))
elif len(list(range(y[0],y[1]+1))) > len(list(range(x[0],x[1]+1))):
del_in.append(spans.index(x))
spans.pop(spans.index(x))
print(spans)
將輸出:
[(1, 7), (8, 15)]
簡短說明:我們開始遍歷跨度列表(迭代x
)。 對於每個元組,我們再次遍歷列表(迭代y
),而忽略x
的元組( if x == y: continue
)。 然后,我們使用list(range())
將每個元組轉換為一個列表(例如(1,4)
到[1, 2, 3, 4]
),並比較列表(盡可能使用set()
)以查看它們是否具有任何共同點。 如果返回的對象的長度大於0,我們將比較兩個列表的長度,以查看保留的是哪一個(跨度較大的列表)。 隨后,我們從列表中刪除跨度較小的項目(使用.pop()
)。 由於迭代x
和y
仍然遍歷我們的初始列表,因此我們需要實現一種機制,以防止腳本比較已刪除條目的項目。 因此,我們使用另一個列表,其中包含已經刪除的條目的模具索引(並將它們留在兩個for循環中)。
可能有更好的方法來執行此操作,但這絕對適用於您的示例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.