簡體   English   中英

在python中查找元組中的重疊數字

[英]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() )。 由於迭代xy仍然遍歷我們的初始列表,因此我們需要實現一種機制,以防止腳本比較已刪除條目的項目。 因此,我們使用另一個列表,其中包含已經刪除的條目的模具索引(並將它們留在兩個for循環中)。

可能有更好的方法來執行此操作,但這絕對適用於您的示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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