zip在python3中,处于优化内存的考虑,只能访问一次!!!(python2中可以访问多次),童鞋们一定要注意,
1
|
* coding: utf - 8 *
|
zip()函数的定义:从参数中的多个迭代器取元素组合成一个新的迭代器;
返回: 返回一个zip对象,其内部元素为元组;可以转化为列表或元组;
传入参数: 元组、列表、字典等迭代器。
当zip()函数中只有一个参数时,zip(iterable)从iterable中依次取一个元组,组成一个元组。
在python 3.0中有个大坑,zip中的数据只能操作一次,内存就会释放,当下次
访问时就会报错,例如例子1中的输出操作
1、zip()函数单个参数
1
2
3
4
5
|
print (‘ = ‘ * 10 + “ zip ()函数单个参数” + ‘ = ‘ * 10 )
list1 = [ 1 , 2 , 3 , 4 ]
tuple1 = zip (list1)
list2 = list (tuple1)
|
打印zip函数的返回类型
print(“zip()函数的返回类型:\n”, type(tuple1))#类型为
将zip对象转化为列表
1
2
3
4
5
|
print (“ zip 对象转化为列表:\n”, list (tuple1)) #值为[(1,), (2,), (3,), (4,)]
print (“ zip 对象转化为列表:\n”, list (tuple1)) #值为[]
print (“list2输出的列表 1 为:\n”,list2)
print (“list2输出的列表 2 为:\n”,list2)
|
当zip()函数有两个参数时:zip(a,b)zip()函数分别从a和b依次各取出一个元素组成
元组,再将依次组成的元组组合成一个新的迭代器–新的zip类型数据。
注意:要求a与b的维数相同,当两者具有相同的行数与列数时,正常组合对应位置元素即可;
当a与b的行数或列数不同时,取两者结构中最小的行数和列数,依照最小的行数和列数将
对应位置的元素进行组合;这时相当于调用itertools.zip_longest(*iterables)函数。
2、zip()函数有2个参数
1
2
3
4
|
print (‘ = ‘ * 10 + “ zip ()函数有 2 个参数” + ‘ = ‘ * 10 )
m = [[ 1 , 2 , 3 ], [ 4 , 5 , 6 ], [ 7 , 8 , 9 ]]
n = [[ 2 , 2 , 2 ], [ 3 , 3 , 3 ], [ 4 , 4 , 4 ]]
p = [[ 2 , 2 , 2 ], [ 3 , 3 , 3 ]]
|
行与列相同
print(“行与列相同:\n”, list(zip(m, n)))
值为[([1, 2, 3], [2, 2, 2]), ([4, 5, 6], [3, 3, 3]), ([7, 8, 9], [4, 4, 4])]
行与列不同
print(“行与列不同:\n”, list(zip(m, p)))
值为[([1, 2, 3], [2, 2, 2]), ([4, 5, 6], [3, 3, 3])]
3、zip()应用,也可以使用for循环+列表推导式实现
矩阵相加减、点乘
m = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
n = [[2, 2, 2], [3, 3, 3], [4, 4, 4]]
矩阵点乘
1
2
3
4
|
print (‘ = ‘ * 10 + “矩阵点乘” + ‘ = ' 10 ) #左右两端各有10个
print ([x * y for a, b in zip (m, n) for x, y in zip (a, b)])
[ 2 , 4 , 6 , 12 , 15 , 18 , 28 , 32 , 36 ]
|
矩阵相加,相减雷同
1
2
3
4
|
print (‘ = ‘ * 10 + “矩阵相加,相减” + ‘ = ‘ * 10 )
print ([x + y for a, b in zip (m, n) for x, y in zip (a, b)])
[ 3 , 4 , 5 , 7 , 8 , 9 , 11 , 12 , 13 ]
|
4、*zip的操作
1
2
3
4
5
6
|
m5 = [ 1 , 2 , 3 ]
n5 = [ 4 , 5 , 6 ]
k5 = [ 7 , 8 , 9 ]
zip5 = zip (m5,n5,k5)
print (“ list (zip5):”, list (zip5))不能输出,否则 zip ( * zip5)
|
就无法执行
1
2
3
4
|
m6,n6,k6 = zip ( * zip5)
print (“m6:”,m6) #m6: (1, 2, 3)
print (“n6:”,n6) #n6: (4, 5, 6)
print (“k6:”,k6) #k6: (7, 8, 9)
|
5、*zip()函数
*zip()函数是zip()函数的逆过程,将zip对象变成原先组合前的数据。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
print (‘ = ‘ * 10 + “ * zip ()函数” + ‘ = ‘ * 10 )
m = [[ 1 , 2 , 3 ], [ 4 , 5 , 6 ], [ 7 , 8 , 9 ]]
n = [[ 2 , 2 , 2 ], [ 3 , 3 , 3 ], [ 4 , 4 , 4 ]]
print (“ zip (m, n)返回:\n”, zip (m, n)) #
print (“ * zip (m, n)返回:\n”, * zip (m, n))
* zip (m, n)返回:([ 1 , 2 , 3 ], [ 2 , 2 , 2 ]) ([ 4 , 5 , 6 ],[ 3 , 3 , 3 ]) ([ 7 , 8 , 9 ], [ 4 , 4 , 4 ])
print (“ list ( zip (m, n))返回:\n”, list ( zip (m, n)))
list ( zip (m, n))返回: [([ 1 , 2 , 3 ], [ 2 , 2 , 2 ]), ([ 4 , 5 , 6 ], [ 3 , 3 , 3 ]), ([ 7 , 8 , 9 ], [ 4 , 4 , 4 ])]
m2, n2 = zip ( * zip (m, n)) #先合到一块
print (“m2:”,m2) #([1, 2, 3], [4, 5, 6], [7, 8, 9])
print (“n2:”,n2) #([2, 2, 2], [3, 3, 3], [4, 4, 4])
print (m = = list (m2) and n = = list (n2)) #true
|
原文链接:https://blog.csdn.net/junchengberry/article/details/80296133