亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將一個列表中的兩個子列表合并為一個子列表python

將一個列表中的兩個子列表合并為一個子列表python

繁星coding 2021-08-05 10:24:25
我有一個字典,其中有一個列表,該列表將成對的數字作為子列表,我試圖檢查子列表之間是否存在重疊。{'5ykw.pdb': [[10, 22], [33, 40], [39, 51], [63, 71], [94, 105]]}[33, 40] 和 [39, 51] 之間有重疊,所以我想合并它們來制作:{'5ykw.pdb': [[10, 22], [33, 51], [63, 71], [94, 105]]}
查看完整描述

3 回答

?
臨摹微笑

TA貢獻1982條經驗 獲得超2個贊

您可以使用廣度優先搜索的遞歸形式:


def overlap(a, b) -> bool:

  return a[-1] >= b[0] and a[-1] < b[-1]


def group(d, _c, seen):

   return [_c, 

     [i if i not in seen else group(d, i, seen+[i]) for i in d if overlap(_c, i)]]


r = {'5ykw.pdb': [[10, 22], [33, 40], [39, 51], [63, 71], [94, 105]]}

new_data = [group(r['5ykw.pdb'], i, []) for i in r['5ykw.pdb'] if not any(overlap(c, i) for c in r['5ykw.pdb'])]

final_data = [a if not b else [a[0], max(h for _, h in b)] for a, b in new_data]

輸出:


[[10, 22], [33, 51], [63, 71], [94, 105]]

這也適用于具有更多重疊的輸入:


r = {'5ykw.pdb':[[15, 20], [18, 21], [19, 30]]}

new_data = [group(r['5ykw.pdb'], i, []) for i in r['5ykw.pdb'] if not any(overlap(c, i) for c in r['5ykw.pdb'])]

final_data = [a if not b else [a[0], max(h for _, h in b)] for a, b in new_data]

輸出:


[[15, 30]]


查看完整回答
反對 回復 2021-08-05
?
慕蓋茨4494581

TA貢獻1850條經驗 獲得超11個贊

您可以使用reduce自定義merge函數來創建新列表:


from functools import reduce


def merge(acc, curr):

    if not len(acc) or acc[-1][1] < curr[0]:

        acc.append(curr)

        return acc

    acc[-1][1] = curr[1] # update last element in accumulator

    return acc


data = {'5ykw.pdb': [[10, 22], [33, 40], [39, 51], [63, 71], [94, 105]]}

data['5ykw.pdb'] = reduce(merge, data['5ykw.pdb'], [])

print(data)

# {'5ykw.pdb': [[10, 22], [33, 51], [63, 71], [94, 105]]}


查看完整回答
反對 回復 2021-08-05
?
紫衣仙女

TA貢獻1839條經驗 獲得超15個贊

你可以簡單地使用這個函數“去重疊”列表:


def deoverlap(lst):

    if not lst:

        return []

    lst = [sorted(pair) for pair in lst]  # sort pairs (leave out if not needed)

    lst = sorted(lst)  # sort by first item (breaking ties by second item)

    out = []

    prev = lst[0]

    for pair in lst[1:]:

        if prev[1] >= pair[0]:

            if prev[1] < pair[1]:

                prev[1] = pair[1]

        else:

            out.append(prev)

            prev = pair

    out.append(prev)

    return out


dct = {'5ykw.pdb': [[10, 22], [33, 40], [39, 51], [63, 71], [94, 105]]}


dct['5ykw.pdb'] = deoverlap(dct['5ykw.pdb'])


print(dct)  # prints {'5ykw.pdb': [[10, 22], [33, 51], [63, 71], [94, 105]]}

這里唯一的假設是輸入deoverlap()是一個可比較類型(通常是數字)的對列表,其中每對是一個長度為 2 的列表。


對在內部排序,然后按第一項排序,如果前對的最大值≥當前對的最小值,則合并。如果當他們是平等的合并應該不會發生,在9日的行deoverlap()應該成為


        if prev[1] > pair[0]:


查看完整回答
反對 回復 2021-08-05
  • 3 回答
  • 0 關注
  • 346 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號