開始學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)]