# 每天學點Python之zip
zip是Python中的一個內建函數,能夠用來組合多個序列類型的數據。它會把傳入的所有序列中下標相同的元素組成一個個元組,以最短的序列為基準。
### 壓縮
所有的序列類型都可以進行壓縮,最終的長度以最短的序列長度為準,不過字典在壓縮時只會保存的它的鍵:
~~~
In[13]: a = [1,2,3]
In[14]: b = "abcde"
In[15]: c = {"one":1,"two":2}
In[16]: z = zip(a,b,c)
In[17]: print(z)
<zip object at 0x00000000041DCEC8>
In[18]: list(z)
Out[18]: [(1, 'a', 'one'), (2, 'b', 'two')]
~~~
如果只有一個序列壓縮,那么同樣會返回元組:
~~~
In[19]: a = [1,2,3]
In[20]: z = zip(a)
In[21]: list(z)
Out[21]: [(1,), (2,), (3,)]
~~~
### 解壓
如果需要對壓縮過的對象進行解壓,只需要在之前添加一個星號*:
~~~
In[39]: z = zip(*zip("hello"))
In[40]: list(z)
Out[40]: [('h', 'e', 'l', 'l', 'o')]
~~~
### 示例
下面兩小段代碼是一個意思,都是將列表進行分段:
~~~
In[64]: list(zip(*[iter(seq)]*3))
Out[64]: [(1, 2, 3), (4, 5, 6), (7, 8, 9)]
In[57]: x = iter(range(1, 10))
In[58]: list(zip(x,x,x))
Out[58]: [(1, 2, 3), (4, 5, 6), (7, 8, 9)]
~~~
下面這個例子是將列表中的數據項進行復制擴展:
~~~
In[43]: x = [1, 2, 3]
In[44]: list(zip(*[x]*3))
Out[44]: [(1, 1, 1), (2, 2, 2), (3, 3, 3)]
~~~
下面這個例子是通過zip來進行字典的鍵值對翻轉:
~~~
In[49]: m = {"a":1, "b":2, "c":3}
In[50]: r = dict(zip(m.values(),m.keys()))
In[51]: r
Out[51]: {1: 'a', 2: 'b', 3: 'c'}
~~~