當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python zip用法及代碼示例


用法:

zip(*iterables, strict=False)

並行迭代幾個可迭代對象,生成元組,每個對象都有一個項目。

例子:

>>> for item in zip([1, 2, 3], ['sugar', 'spice', 'everything nice']):
...     print(item)
...
(1, 'sugar')
(2, 'spice')
(3, 'everything nice')

更正式地說:zip() 返回元組的迭代器,其中 i -th 元組包含來自每個參數迭代的 i -th 元素。

zip() 的另一種理解方式是將行轉換為列,將列轉換為行。這類似於 transposing a matrix

zip() 是惰性的:在迭代迭代之前不會處理元素,例如通過 for 循環或包裝在 list 中。

需要考慮的一件事是傳遞給zip() 的迭代可能有不同的長度;有時是設計使然,有時是因為準備這些迭代的代碼中的錯誤。 Python 提供了三種不同的方法來處理這個問題:

  • 默認情況下,zip() 在最短的迭代用完時停止。它將忽略較長迭代中的剩餘項,將結果截斷為最短迭代的長度:

    >>> list(zip(range(3), ['fee', 'fi', 'fo', 'fum']))
    [(0, 'fee'), (1, 'fi'), (2, 'fo')]
  • zip() 通常用於假設可迭代的長度相等的情況。在這種情況下,建議使用strict=True 選項。它的輸出與常規 zip() 相同:

    >>> list(zip(('a', 'b', 'c'), (1, 2, 3), strict=True))
    [('a', 1), ('b', 2), ('c', 3)]

    與默認行為不同,它檢查可迭代對象的長度是否相同,如果不是,則引發 ValueError

    >>> list(zip(range(3), ['fee', 'fi', 'fo', 'fum'], strict=True))
    Traceback (most recent call last):
      ...
    ValueError: zip() argument 2 is longer than argument 1

    如果沒有strict=True 參數,任何導致不同長度的迭代的錯誤都將被靜音,可能表現為程序另一部分中難以發現的錯誤。

  • 較短的可迭代對象可以用一個常數值填充,以使所有可迭代對象具有相同的長度。這是由 itertools.zip_longest() 完成的。

邊情況:使用單個可迭代參數,zip() 返回 1 元組的迭代器。沒有參數,它返回一個空的迭代器。

技巧和竅門:

  • 保證迭代的從左到右的評估順序。這使得使用 zip(*[iter(s)]*n, strict=True) 將數據係列聚類到 n-length 組中成為可能。這將重複 same 迭代器 n 次,以便每個輸出元組都具有對迭代器的 n 調用的結果。這具有將輸入劃分為n-length 塊的效果。

  • zip()* 運算符一起可用於解壓縮列表:

    >>> x = [1, 2, 3]
    >>> y = [4, 5, 6]
    >>> list(zip(x, y))
    [(1, 4), (2, 5), (3, 6)]
    >>> x2, y2 = zip(*zip(x, y))
    >>> x == list(x2) and y == list(y2)
    True

在 3.10 版中更改:添加了strict爭論。

相關用法


注:本文由純淨天空篩選整理自python.org大神的英文原創作品 zip。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。