首頁 > 軟體

python3.x zip用法小結

2022-11-15 14:00:32

1.zip用法簡介

在python 3.x系列中,zip方法返回的為一個zip object可迭代物件。

class zip(object):
    """
    zip(*iterables) --> zip object
    
    Return a zip object whose .__next__() method returns a tuple where
    the i-th element comes from the i-th iterable argument.  The .__next__()
    method continues until the shortest iterable in the argument sequence
    is exhausted and then it raises StopIteration.
    """

通過上面的註釋,不難看出該迭代器的兩個關鍵點:

1.迭代器的next方法返回一個元組,元組的第i個元素為各個輸入引數的第i個元素。

2.迭代器的next方法,遇到輸入序列中最短的那個序列迭代完畢,則會停止執行。

為了看清楚zip的效果,我們先看個最簡單的例子

def fun0():
    a = ['a', 'b', 'c', 'd']
    b = ['1', '2', '3', '4']
    result = zip(a, b)
    print(type(result))
    try:
        while True:
            print(next(result))
    except StopIteration:
        pass

上面的程式碼,輸出結果為

<class 'zip'>
('a', '1')
('b', '2')
('c', '3')
('d', '4')

首先可以看到的是,zip方法返回的,是一個zip物件。

zip物件是個迭代器,用next方法即可對其完成遍歷。

當然我們也可以用for迴圈完成對zip物件的遍歷。

def fun00():
    a = ['a', 'b', 'c', 'd']
    b = ['1', '2', '3', '4']
    result = zip(a, b)
    for ele in result:
        print(ele)

('a', '1')
('b', '2')
('c', '3')
('d', '4')

2.引數不等長進行截斷

zip方法中,如果傳入的引數不等長,則會進行截斷,截斷的時候會取最短的那個序列,超過最短序列長度的其他序列元素,則會被捨棄掉。

def fun0():
    a = ['a', 'b', 'c', 'd']
    b = ['1', '2', '3', '4', '5', '6']
    result = zip(a, b)
    try:
        while True:
            print(next(result))
    except StopIteration:
        pass

上述的方法如果執行,結果為

('a', '1')
('b', '2')
('c', '3')
('d', '4')

3.python3.x 與2.x中zip的不同

python3.x中,zip方法返回的是一個zip物件,本質是一個迭代器。而在python2.x中,zip方法直接返回一個list。

返回迭代器的好處在於,可以節省list佔用的記憶體,只在有需要的時候再呼叫相關資料。

4.用zip方法構建字典

zip方法在實際中用途非常廣泛,我們下面可以看幾個實際中常用的例子。

zip方法可以用來構建字典。

字典包含兩部分資料:key列表與value列表。如果我們現在有key序列與value序列,用zip方法可以很快構建一個字典。

def fun5():
    names = ['lili', 'lucy', 'tracy', 'larry']
    scores = [98, 10, 75, 90]
    my_dict = dict(zip(names, scores))
    print(my_dict)

{'lili': 98, 'lucy': 10, 'tracy': 75, 'larry': 90}

5.對多個序列的元素進行排序

排序也是日常工作中的常見需求,對多個序列進行排序而不破壞其元素的相對關係,也非常常見。下面我們來看一個常見的案例

還是以之前的資料為例

有names序列與scores序列,我們希望按照names進行排序,同時保持對應的scores資料。

def fun3():
    names = ['lili', 'lucy', 'tracy', 'larry']
    scores = [98, 10, 75, 90]
    data = sorted(list(zip(names, scores)), key=lambda x: x[0], reverse=False)
    print(data)

輸出的結果為

[('larry', 90), ('lili', 98), ('lucy', 10), ('tracy', 75)]

如果我們希望按照分數逆序排,則可以按如下程式碼執行

def fun3():
    names = ['lili', 'lucy', 'tracy', 'larry']
    scores = [98, 10, 75, 90]
    data = sorted(list(zip(names, scores)), key=lambda x: x[1], reverse=True)
    print(data)

[('lili', 98), ('larry', 90), ('tracy', 75), ('lucy', 10)]

6.對多組資料進行計算

假設我們有3個序列,sales,costs,allowances。其中利潤為銷售額-成本+補貼,現在我們想求每組利潤,就可以使用zip方法。

def fun4():
    sales = [10000, 9500, 9000]
    costs = [9000, 8000, 7000]
    allowances = [200, 100, 150]
    for sale, cost, allowance in zip(sales, costs, allowances):
        profit = sale - cost + allowance
        print(f"profit is: {profit}")

profit is: 1200
profit is: 1600
profit is: 2150

當然我們也可以使用for迴圈

def fun4():
    sales = [10000, 9500, 9000]
    costs = [9000, 8000, 7000]
    allowances = [200, 100, 150]
    for sale, cost, allowance in zip(sales, costs, allowances):
        profit = sale - cost + allowance
        print(f"profit is: {profit}")
    for i in range(len(sales)):
        profit = sales[i] - costs[i] + allowances[i]
        print(f"profit is: {profit}")

很明顯zip方法比for迴圈還是要更直觀,更簡潔,更優雅。

7.*操作符進行解壓

我們還可以使用*操作符對zip物件進行解壓,效果是將zip object還原至原來的物件,效果就類似於壓縮以後得解壓。

def fun():
    a = ['a', 'b', 'c', 'd']
    b = ['1', '2', '3', '4']
    result = list(zip(a, b))
    print(result)
    zipobj = zip(a, b)
    a1, a2 = zip(*zipobj)
    print(list(a1))
    print(a2)

上面程式碼執行的結果為

[('a', '1'), ('b', '2'), ('c', '3'), ('d', '4')]
['a', 'b', 'c', 'd']
('1', '2', '3', '4')

到此這篇關於python3.x zip用法詳解的文章就介紹到這了,更多相關python3 使用 zip內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com