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

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

Python遞歸通過(guò)滑動(dòng)窗口拆分字符串

Python遞歸通過(guò)滑動(dòng)窗口拆分字符串

慕田峪4524236 2022-12-14 20:56:58
最近,我遇到了一個(gè)有趣的編碼任務(wù),涉及將字符串拆分為具有給定 K 限制大小的多個(gè)排列。例如:s = "iamfoobar"k = 4  # the max number of the items on a list after the splits可以拆分為以下組合[    ["i", "a", "m", "foobar"],    ["ia", "m", "f", "oobar"],    ["iam", "f", "o", "obar"]# etc]我試圖弄清楚如何使用快速遞歸函數(shù)來(lái)做到這一點(diǎn),但我無(wú)法讓它工作。我已經(jīng)試過(guò)了,但似乎沒(méi)有用def sliding(s, k):    if len(s) < k:        return []    else:        for i in range(0, k):            return [s[i:i+1]] + sliding(s[i+1:len(s) - i], k)print(sliding("iamfoobar", 4))只有這個(gè)['i', 'a', 'm', 'f', 'o', 'o']
查看完整描述

2 回答

?
HUX布斯

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

您的第一個(gè)主要問(wèn)題是,盡管您使用循環(huán),但您會(huì)立即返回一個(gè)列表。因此,無(wú)論您如何修復(fù)周?chē)囊磺?,您的輸出都永遠(yuǎn)不會(huì)符合您的預(yù)期……一個(gè)列表。


其次,在您開(kāi)始的遞歸調(diào)用中,s[i:i+1]但根據(jù)您的示例,您需要所有前綴,因此s[:i]更合適。


另外,在遞歸調(diào)用中你永遠(yuǎn)不會(huì)減少k這是自然的遞歸步驟。


最后,你的停止條件似乎也是錯(cuò)誤的。如上所述,如果自然步驟減少,k則自然停止。這是因?yàn)閷⒆址鸱譃?1 個(gè)部分的唯一方法是字符串本身......if k == 1return [[s]]


重要的是要牢記您的最終輸出格式,并思考它如何在您的步驟中發(fā)揮作用。在這種情況下,您希望以列表的形式返回所有可能排列的列表。因此,在 的情況下k == 1,您只需返回單個(gè)字符串列表的列表。


現(xiàn)在,作為這一步,您希望每次都采用不同的前綴,并向其添加調(diào)用字符串其余部分的所有排列k-1??偠灾?,代碼可以是這樣的:


def splt(s, k):

    if k == 1:  # base sace - stop condition

        return [[s]]


    res = []

    # loop over all prefixes

    for i in range(1, len(s)-k+2):

        for tmp in splt(s[i:], k-1):

            # add to prefix all permutations of k-1 parts of the rest of s

            res.append([s[:i]] + tmp)

    return res

您可以在一些輸入上對(duì)其進(jìn)行測(cè)試,看看它是如何工作的。


如果您不限于遞歸,另一種方法是使用itertools.combinations. 您可以使用它在字符串中創(chuàng)建所有索引組合,將其拆分為多個(gè)k部分,然后簡(jiǎn)單地連接這些部分并將它們放入列表中。原始版本類(lèi)似于:


from itertools import combinations


def splt(s, k):

    res = []

    for indexes in combinations(range(1, len(s)), k-1):

        indexes = [0] + list(indexes) + [len(s)] # add the edges to k-1 indexes to create k parts

        res.append([s[start:end] for start, end in zip(indexes[:-1], indexes[1:])]) # concatenate the k parts


    return res


查看完整回答
反對(duì) 回復(fù) 2022-12-14
?
長(zhǎng)風(fēng)秋雁

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

您實(shí)現(xiàn)中的主要問(wèn)題是您的循環(huán)沒(méi)有執(zhí)行預(yù)期的操作,因?yàn)樗祷氐谝粋€(gè)結(jié)果而不是附加結(jié)果。


下面是一個(gè)實(shí)現(xiàn)示例:


def sliding(s, k):

    # If there is not enough values of k is below 0

    # there is no combination possible

    if len(s) < k or k < 1:

        return []


    # If k is one, we return a list containing all the combinations,

    # which is a single list containing the string

    if k == 1:

        return [[s]]


    results = []

    # Iterate through all the possible values for the first value

    for i in range(1, len(s) - k + 2):

        first_value = s[:i]

        # Append the result of the sub call to the first values

        for sub_result in sliding(s[i:], k - 1):

            results.append([first_value] + sub_result)


    return results


print(sliding("iamfoobar", 4))


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

添加回答

舉報(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)