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

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

不使用列表長度迭代子列表

不使用列表長度迭代子列表

揚帆大魚 2023-06-13 16:17:29
我有一個清單,我需要對 3 個元素的連續(和重疊)組應用一些處理:我可以這樣做:for i in range(len(things)-2):     process(things[i:i+3])例如:things=[0, 1, 2, 3, 4, 5, 6, 7]我想處理:[0, 1, 2], [1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6], [5, 6, 7]但是有沒有一種聰明的(但可讀的)方法可以在不顯式使用的情況下做到這一點len(things)?
查看完整描述

3 回答

?
慕的地6264312

TA貢獻1817條經驗 獲得超6個贊

是的,您正在尋找的是滑動/移動窗口。有多種方法可以實現這一點,但最簡單的方法是tee()使用. 使用它,您可以定義如下所示的默認窗口大小為 2 的函數。islice()itertoolswindow()


import itertools


def window(iterable, n=2):

    iters = itertools.tee(iterable, n)

    for i, it in enumerate(iters):

        next(itertools.islice(it, i, i), None)

    return zip(*iters)

然后你可以將它用作


>>> things=[0, 1, 2, 3, 4, 5, 6, 7]

>>> list(window(things, n = 3))

[(0, 1, 2), (1, 2, 3), (2, 3, 4), (3, 4, 5), (4, 5, 6), (5, 6, 7)]

>>> for elem in window(things, n = 3):

...     print(elem)

... 

(0, 1, 2)

(1, 2, 3)

(2, 3, 4)

(3, 4, 5)

(4, 5, 6)

(5, 6, 7)

編輯:一次使用更簡單的選項可能是


>>> list(zip(things, things[1:], things[2:]))

[(0, 1, 2), (1, 2, 3), (2, 3, 4), (3, 4, 5), (4, 5, 6), (5, 6, 7)]


查看完整回答
反對 回復 2023-06-13
?
慕哥6287543

TA貢獻1831條經驗 獲得超10個贊

讓我們嘗試使用enumerate,這len(things[i : i+len_]) == len_是刪除在結束迭代時累積的大小不均的列表。


len_ = 3


[things[i : i+len_] for i, j in enumerate(things) if len(things[i : i+len_]) == len_]


[[0, 1, 2], [1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6], [5, 6, 7]]

len_ = 4


[things[i : i+len_] for i, j in enumerate(things) if len(things[i : i+len_]) == len_]


[[0, 1, 2, 3], [1, 2, 3, 4], [2, 3, 4, 5], [3, 4, 5, 6], [4, 5, 6, 7]]


查看完整回答
反對 回復 2023-06-13
?
慕妹3146593

TA貢獻1820條經驗 獲得超9個贊

另一種方法可能是:

for i in things[0:-2]:
    a=things.index(i)
    process(things[a:a+3])


查看完整回答
反對 回復 2023-06-13
  • 3 回答
  • 0 關注
  • 195 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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