第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何在列表中查找重疊元組并返回重疊元組

如何在列表中查找重疊元組并返回重疊元組

慕蓋茨4494581 2022-06-07 19:27:39
我目前有一個(gè)包含元組的列表。overlap_list = [(10001656, 10001717), (700, 60000), (10001657, 10001718), (10001657, 10001716), (10031548, 10031643), (10031556, 10031656)]我想要以下輸出:new_list=[(10001656, 10001717),(10001657, 10001718),(10001657, 10001716),(10031548, 10031643), (10031556, 10031656)]元組內(nèi)的數(shù)字是開始和結(jié)束邊界。我想找到數(shù)字之間重疊的任何元組。我已經(jīng)嘗試過我找到的這段代碼,它問了一個(gè)類似的問題:import itertools as ittoolsdef pairwise(iterable):    a, b = ittools.tee(iterable)    next(b, None)    return zip(a, b)overlap_list = [(10001656, 10001717), (700, 60000), (10001657, 10001718), (10001657, 10001716), (10031548, 10031643), (10031556, 10031656)]print([list(p) for k, p in it.groupby(pairwise(overlap_list), lambda x: x[0][0] < x[1][0] < x[0][1]) if k])但這給出了:[[((10031548, 10031643), (10031556, 10031656))]]我看過不同的解決方案,但我面臨的問題是,按之前的位置進(jìn)行索引似乎不起作用。如何獲得所需的輸出?任何幫助將不勝感激。
查看完整描述

2 回答

?
ibeautiful

TA貢獻(xiàn)1993條經(jīng)驗(yàn) 獲得超6個(gè)贊

老實(shí)說-我并不真正了解您的代碼及其背后的想法,因此無法告訴您為什么結(jié)果僅包含所需元組的子集。


但是,我有一個(gè)不同的方法,你可能會(huì)覺得有趣。

主要思想是有一個(gè)可以測(cè)試兩個(gè)元組是否重疊的函數(shù)。此函數(shù)適用于overlap_list. 如果兩個(gè)重疊,則將它們添加到結(jié)果列表中,該列表隨后將包含重復(fù)項(xiàng),因此list(set(result))最終應(yīng)用。但是,您可以將演員表放在列表中,因?yàn)橐唤M都可以,因此我可以...


測(cè)試函數(shù)的想法是簡(jiǎn)單地對(duì)要測(cè)試的兩個(gè)元組的 4 個(gè)值進(jìn)行排序并查看排序順序(請(qǐng)參閱 參考資料numpy.argsort)。如果前兩個(gè)索引是 0/1 或 2/3,則兩個(gè)元組不重疊。

換句話說:針對(duì)存在進(jìn)行測(cè)試,>1它們必須是不相等的,即不能同時(shí)為真或假:


def overlap_test(tpl1, tpl2):

    import numpy as np

    a, b = np.argsort(tpl1 + tpl2)[:2] > 1

    return a != b

這是使用該函數(shù)的循環(huán):


import itertools as it

result = []

for test_tpl, sec_tpl in list(it.combinations(overlap_list, 2)):

    if overlap_test(test_tpl, sec_tpl):

        result.extend([test_tpl, sec_tpl])

result = list(set(result))


# [(10001657, 10001718),

#  (10031556, 10031656),

#  (10031548, 10031643),

#  (10001657, 10001716),

#  (10001656, 10001717)]

我仍然想知道循環(huán)是否不能更有效,并且這樣是否也set無法優(yōu)化對(duì)循環(huán)的需求 - 好吧,也許你會(huì)找到一個(gè)更好的循環(huán)。


編輯:


到目前為止并沒有真正發(fā)現(xiàn)有什么不同,但有一點(diǎn)改進(jìn):


相同的方法,但從set一開始就使用:


def find_overlap_tuples_0(tpl_list):

    result = set()

    for test_tpl, sec_tpl in list(it.combinations(tpl_list, 2)):

        if overlap_test(test_tpl, sec_tpl):

            result.add(test_tpl)

            result.add(sec_tpl)

    return list(result)


# %timeit find_overlap_tuples_0(overlap_list)

# 178 μs ± 4.87 μs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

有點(diǎn)不同,僅基于排列和分組(似乎稍微快一點(diǎn)):


def find_overlap_tuples_1(tpl_list):

    result = set()

    no_ovl = set()

    for a, grp in it.groupby(it.permutations(tpl_list, 2), lambda x: x[0]):

        for b in grp:

            if (a not in result) and (b[1] not in no_ovl):

                if overlap_test(*b):

                    result.add(b[0])

                    result.add(b[1])

                    break

                no_ovl.add(b[0])

    return list(result)


# %timeit find_overlap_tuples_1(overlap_list)

# 139 μs ± 1.59 μs per loop (mean ± std. dev. of 7 runs, 10000 loops each)


查看完整回答
反對(duì) 回復(fù) 2022-06-07
?
汪汪一只貓

TA貢獻(xiàn)1898條經(jīng)驗(yàn) 獲得超8個(gè)贊

似乎您可以對(duì)列表進(jìn)行排序,以便任何重疊的開始和停止都是相鄰的,然后只比較鄰居以確定是否由于不重疊而需要過濾掉任何元組(不需要在代碼末尾進(jìn)行排序,只是更容易在打印輸出中看到重疊的鄰居)。


l = [(10001656, 10001717), (700, 60000), (10001657, 10001718), (10001657, 10001716), (10031548, 10031643), (10031556, 10031656)]


l.sort()

overlap = set()

for a, b in zip(l, l[1:]):

    if a[1] >= b[0] and a[1] <= b[1]:

        overlap.add(a)

    if b[0] >= a[0] and b[0] <= a[1]:

        overlap.add(b)


overlap = sorted(overlap)        

print(overlap)

# [(10001657, 10001716), (10001657, 10001718), (10031548, 10031643), (10031556, 10031656)]



查看完整回答
反對(duì) 回復(fù) 2022-06-07
  • 2 回答
  • 0 關(guān)注
  • 153 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)