日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python迭代器生成器使用技巧(2):切片、遍历、索引值、多序列、多容器对象

發布時間:2025/3/15 python 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python迭代器生成器使用技巧(2):切片、遍历、索引值、多序列、多容器对象 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 迭代器切片

迭代器和生成器不能使用標準的切片操作,因為它們的長度事先并不知道(并且也沒有實現索引)。 函數 islice() 返回一個可以生成指定元素的迭代器,通過遍歷并丟棄直到切片開始索引位置的所有元素,然后開始一個個的返回元素,并直到切片結束索引位置。

import itertools def count(n):while True:yield n n += 1c = count(0) # print( c[10:20] ) # TypeError: 'generator' object is not subscriptablefor num in itertools.islice(c, 10, 15):print(num) # >>> 10, 11, 12, 13, 14

這里需要強調的一點是 islice() 會消耗掉傳入的迭代器中的數據。 而迭代器是不可逆的。 所以如果需要之后再次訪問這個迭代器的話,就得先將它里面的數據放入一個列表中了。

2. 排列組合的迭代遍歷

如果我們想迭代遍歷集合中元素的所有可能的排列或組合,可以用itertools模塊提供兩函數來解決這類問題。

  • itertools.permutations() , 接受集合并產生一個元組序列,每個元組由集合中所有元素的一個可能排列組成。 也就是說通過打亂集合中元素排列順序生成一個元組。如果想得到指定長度的排列,可以傳遞長度參數permutation(items, length)。
from itertools import permutationsitems = ['a', 'b', 'c'] for sample in permutations(items):print( sample ) # >>> ('a', 'b', 'c') # ('a', 'c', 'b') # ('b', 'a', 'c') # ('b', 'c', 'a') # ('c', 'a', 'b') # ('c', 'b', 'a')
  • itertools.combinations() 得到輸入集合中元素的所有的組合
from itertools import combinations for sample in combinations(items, 3):print(sample) # >>> ('a', 'b', 'c')

對于 combinations() ,元素的順序已經不重要了。 也就是說,組合 ('a', 'b') 跟 ('b', 'a') 其實是一樣的.

3. 序列上索引值迭代?enumerate()

如果我們想在迭代一個序列的同時跟蹤正在被處理的元素索引時可以采用這種方法。這種情況在遍歷文件時想在錯誤消息中使用行號定位時候非常有用。

my_list = ['a', 'b', 'c'] for idx, val in enumerate(my_list):print(idx, val) # >>> 0 a # 1 b # 2 c

遍歷文件消息時,可以直接用于發現文件消息發生錯誤所處的位置(行號):

def parse_data(filename):with open(filename, 'rt') as f:for idx, line in enumerate(f,1): # from Line 1fields = line.split()try:# cnt = int (fields[1])passexcept ValueError as e:print('Line{}:Parse error: {}'.format(idx, e))parse_data('test.txt')

4. 同時迭代多個序列 zip()

如何同時迭代多個序列,每次分別從一個序列中取一個元素?zip()函數就是為了解決多個序列同時迭代而設計的。

  • zip() 最小迭代終止
xpts = [1, 5, 4, 2, 10] ypts = [101, 78, 37, 15, 62, 99,56, 22] for x, y in zip(xpts, ypts):print(x,y) # >>> 1 101 # 5 78 # 4 37 # 2 15 # 10 62

zip(a, b) 會生成一個可返回元組 (x, y) 的迭代器,其中x來自a,y來自b。 一旦其中某個序列到底結尾,迭代宣告結束。 因此迭代長度跟參數中最短序列長度一致

  • zip_longest() 最大迭代終止
from itertools import zip_longestxpts = [1, 5, 4, 2, 10] ypts = [101, 78, 37, 15, 62, 99, 56, 22] for x, y in zip_longest(xpts, ypts):print(x,y) # >>> 1 101 # 5 78 # 4 37 # 2 15 # 10 62 # None 99 # None 56 # None 22

zip() 函數對于同時處理兩個、兩個以上的序列非常有用。需要注意的一點是:zip() 會創建一個迭代器來作為結果返回。 如果需要將結對的值存儲在列表中,要使用list() 函數

xpts = [1, 5, 4, 2, 10] ypts = [101, 78, 37, 15, 62, 99, 56, 22] print(zip(xpts, ypts)) # >>> <zip object at 0x0000000007505F88> print(list(zip(xpts, ypts))) # >>> [(1, 101), (5, 78), (4, 37), (2, 15), (10, 62)]

5. 不同集合上元素的迭代

如果我們想在多個對象執行相同的操作,但是這些對象在不同的容器中。在不失可讀性的情況下如何避免寫重復的循環?itertools.chain() 可以用來簡化這個任務。 它接受可迭代對象列表作為輸入,并返回一個迭代器,有效的屏蔽掉在多個容器中迭代細節。?

from itertools import chaina = [1, 2] b = ['x', 'y', 'z'] for x in chain(a, b):print(x) # >>> 1 2 x y zprint(chain(a, b)) # >>> <itertools.chain object at 0x0000000008B18978>print(list(chain(a,b))) # >>> [1, 2, 'x', 'y', 'z']

itertools.chain() 接受一個或多個可迭代對象作為輸入參數。 然后創建一個迭代器,依次連續的返回每個可迭代對象中的元素。 這種方式(chain(a,b))要比先將序列合并(a+b)再迭代要高效的多。a + b 操作會創建一個全新的序列并要求a和b的類型一致。 chian() 不會有這一步,所以如果輸入序列非常大的時候會很省內存。 并且當可迭代對象類型不一樣的時候 chain() 同樣可以很好的工作。

文章參考《python3-cookbook》

總結

以上是生活随笔為你收集整理的python迭代器生成器使用技巧(2):切片、遍历、索引值、多序列、多容器对象的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 综合色导航 | 伊人色综合久久久 | 国产一级二级三级 | 视频在线观看网站免费 | 少妇毛片一区二区三区粉嫩av | 有码中文 | 中文字幕在线观看国产 | 亚洲欧美小视频 | 免费草逼视频 | 一区在线免费 | 中国黄色三级视频 | 精品国产一区二区三区久久久 | 狠狠狠狠狠干 | 红桃视频一区二区三区免费 | 一级黄在线观看 | 日韩伊人网 | 美女试爆场恐怖电影在线观看 | 99视频久| 久久男人 | 欧美高清一区 | 亚洲黄色一区二区 | 黄网在线免费观看 | 日韩成人黄色片 | 男女黄床上色视频 | 欧洲亚洲女同hd | 精品成在人线av无码免费看 | 成人亚洲电影 | 精品国产xxx | 日本做爰全过程免费看 | 波多野结衣小视频 | 中文字幕乱码一区二区三区 | 在线观看中文字幕 | 国产v综合v亚洲欧美久久 | 三上悠亚一区二区 | 亚洲乱熟女一区二区 | 日韩中文字幕视频在线 | 欧美呦交| 毛茸茸日本熟妇高潮 | 国产一级免费观看 | 欧美亚洲国产一区 | 亚洲国产网址 | 射射色 | 欧美一区亚洲二区 | 一区二区精品视频 | 日韩人妻一区 | 日日撸夜夜操 | 在线视频观看国产 | 第色| 在线色av| 香蕉精品视频在线观看 | 日韩影视一区 | 97caoporn| 丰满熟女一区二区三区 | 99热2| 日韩最新中文字幕 | 亚洲xxxxxx | 日日夜夜精品免费视频 | 麻豆视频免费网站 | 国语对白av| 91精品久久人妻一区二区夜夜夜 | 国产sm调教一区二区 | 综合久久精品 | 国产成人精品免高潮在线观看 | 中文字幕在线播放第一页 | 狠狠天堂| 丝袜人妻一区二区三区 | 天天草天天操 | 熊猫电影yy8y全部免费观看 | 全黄一级裸体片 | 欧洲美女与动交zozzo | 就操在线 | 苍井空张开腿实干12次 | 丁香婷婷综合激情 | a毛片基地| 四虎精品在线 | 3d动漫啪啪精品一区二区中文字幕 | 日本黄视频在线观看 | 天堂网av2018 | 日韩激情在线观看 | 十大污视频 | 中文不卡视频 | 亚洲国产va | 精品一二三区久久aaa片 | 一二三四av | 国产精品电影一区二区三区 | 蜜臀在线播放 | 色婷婷狠狠 | 白白色在线观看 | 伊人日本| aaa大片十八岁禁止 中文字幕亚洲在线观看 | 91片黄在线观看喷潮 | 亚洲精品1区2区3区 国产丝袜网站 | 91一区二区三区在线观看 | 韩国精品在线观看 | 日韩在线黄色 | 国产欧美一区二区三区鸳鸯浴 | 最新中文字幕第一页 | 91免费看视频 | 国产经典久久久 |