zip()函數

開始學python啦,第一篇章就以zip()內置函數,這個函數是看生成驗證碼的時候,竟然可以通過zip實現並行遍歷,覺得很神奇,這個這種遍歷方式,java還真沒有。

python zip是一個非常有用的內建函數,它可以實現並行遍歷,也可以將兩個或多個列表,轉換成一個元組或者字典。具體的通過示例來看下

案例一 將兩個列表合成一個元組


ids = [1, 2, 3, 4]
names = ['zhangsan', 'lisi', 'wangwu', 'zhaoliu']
persons = zip(ids, names)
print(list(persons))

運行結果

[(1, 'zhangsan'), (2, 'lisi'), (3, 'wangwu'), (4, 'zhaoliu')]

案例二 將兩個列表合成一個字典


# 方式一 通過並行遍歷實現
ids = [1, 2, 3, 4]
names = ['zhangsan', 'lisi', 'wangwu', 'zhaoliu']
person_dict = {i:name for i,name in zip(ids,names)}
print(person_dict)
# 方式二 用dict函數將元組列表轉換爲字典
person_dict_2 = dict(zip(ids, names))
print(person_dict_2)
# {1: 'zhangsan', 2: 'lisi', 3: 'wangwu', 4: 'zhaoliu'}

# 追加
update_ids = [5,6]
update_names = ['tianqi','xiaoxiao']
person_dict_2.update(zip(update_ids,update_names))
print(person_dict_2)
# {1: 'zhangsan', 2: 'lisi', 3: 'wangwu', 4: 'zhaoliu', 5: 'tianqi', 6: 'xiaoxiao'}

案例三、兩個集合長度不等,如何組成一個元組或者說字典


# 方式三
ids = [1, 2, 3, 4]
names = ['zhangsan', 'lisi']
persons = zip(ids, names)
print(list(persons))
# [(1, 'zhangsan'), (2, 'lisi')] 

從上面輸出來看,zip函數的結果基於最短的可迭代項,所以3,4丟棄了。那我想要保留呢

from itertools import zip_longest

ids = [1, 2, 3, 4]
names = ['zhangsan', 'lisi']
persons = zip_longest(ids, names)
print(list(persons))
# [(1, 'zhangsan'), (2, 'lisi'), (3, None), (4, None)]

# 如果想填充默認值呢
persons = zip_longest(ids, names, fillvalue='xxx')
print(list(persons))
# [(1, 'zhangsan'), (2, 'lisi'), (3, 'xxx'), (4, 'xxx')]

案例四、和案例一相反,將一個元組轉換成兩個列表


persons = [(1, 'zhangsan'), (2, 'lisi'), (3, 'wangwu'), (4, 'zhaoliu')]
ids, names = zip(*persons)
print(ids)
print(names)

運行結果

(1, 2, 3, 4)
('zhangsan', 'lisi', 'wangwu', 'zhaoliu')

在上面的示例中,星號執行了拆包操作,即從記錄列表中拆包所有四個元組


案例五、在for循環中使用zip函數

ids = [1, 2, 3, 4]
names = ['zhangsan', 'lisi', 'wangwu', 'zhaoliu']
sexs = ['男', '男', '女', '女']
for id,name,sex in zip(ids,names,sexs):
    print(f'id={id},名稱={name},性別={sex}')

運行結果

id=1,名稱=zhangsan,性別=男
id=2,名稱=lisi,性別=男
id=3,名稱=wangwu,性別=女
id=4,名稱=zhaoliu,性別=女    

再舉一個例子: 同時遍歷多個字典

dict_one = {'name': '小小', 'age': '8', 'sex': '女'}
dict_two = {'name': '西西', 'age': '8', 'sex': '男'}
for (k1, v1), (k2, v2) in zip(dict_one.items(), dict_two.items()):
    print(k1, '->', v1)
    print(k2, '->', v2)

運行結果

name -> 小小
name -> 西西
age -> 8
age -> 8
sex -> 女
sex -> 男

案例六、矩陣轉置


matrix = [[1, 2, 3], [4, 5, 6]]
transposed = list(zip(*matrix))
print(transposed)

運行結果

[(1, 4), (2, 5), (3, 6)]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章