python的zip函数妙用(zip的用法python)

发布时间:2022-11-15

本文目录一览:

1、python 当中的zip( )函数到底是干嘛的? 2、python zip函数 3、python zip函数的用法 4、python中zip函数有哪些高级用法 5、python zip 是什么 6、Python 之内置函数:filter、map、reduce、zip、enumerate

python 当中的zip( )函数到底是干嘛的?

这个可以理解为拉链,将两个list拉到一起来,每个对应元素做一定操作后,合并成一个list. 比如:

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

结果是:

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

python zip函数

zip()函数用于将可迭代的对象作为参考,将对象中对应的元素打包成一个个元组,然后返回有这些元组组成的列表。

zip([iterabale,....])

python zip函数的用法

定义: zip([iterable, ...]) zip()是Python的一个内建函数,它接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个tuple(元组),然后返回由这些 tuples组成的list(列表)。若传入参数的长度不等,则返回list的长度和参数中长度最短的对象相同。利用*号操作符,可以将list unzip(解压),看下面的例子就明白了:

1 2 3 4 5 6 7 8 9
a = [1,2,3]
b = [4,5,6]
c = [4,5,6,7,8]
zipped = zip(a,b)
# [(1, 4), (2, 5), (3, 6)]
zip(a,c)
# [(1, 4), (2, 5), (3, 6)]
zip(*zipped)
# [(1, 2, 3), (4, 5, 6)]

对于这个并不是很常用函数,下面举几个例子说明它的用法:

二维矩阵变换(矩阵的行列互换)

比如我们有一个由列表描述的二维矩阵:

a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

通过python列表推导的方法,我们也能轻易完成这个任务:

print([[row[col] for row in a] for col in range(len(a[0]))])
# [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

另外一种让人困惑的方法就是利用zip函数:

a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
zip(*a)
# [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
map(list, zip(*a))
# [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

这种方法速度更快但也更难以理解,将list看成tuple解压,恰好得到我们“行列互换”的效果,再通过对每个元素应用list()函数,将tuple转换为list。

以指定概率获取元素

import random
def random_pick(seq, probabilities):
    x = random.uniform(0, 1)
    cumulative_probability = 0.0
    for item, item_probability in zip(seq, probabilities):
        cumulative_probability += item_probability
        if x < cumulative_probability:
            break
    return item
for i in range(15):
    random_pick("abc",[0.1,0.3,0.6])
# 'c' 'b' 'c' 'c' 'a' 'b' 'c' 'c' 'c' 'a' 'b' 'b' 'c' 'a' 'c'

这个函数有个限制,指定概率的列表必须和元素一一对应,而且和为1,否则这个函数可能不能像预想的那样工作。 稍微解释下,先利用random.uniform()函数生成一个0-1之间的随机数并赋值给x,利用zip()函数将元素和它对应的概率打包成tuple,然后将每个元素的概率进行叠加,直到和大于x终止循环。 这样,"a"被选中的概率就是x取值位于0-0.1的概率,同理"b"为0.1-0.4,"c"为0.4-1.0,假设x是在0-1之间平均取值的,显然我们的目的已经达到。

python中zip函数有哪些高级用法

zip()功能是从参数的多个迭代器中选取元素组合成一个新的迭代器。顾名思义,它就是一个将对象进行打包和解包的函数。 它可以传入的参数包括:元组、列表、字典等迭代器。 它返回一个zip对象,其内部元素为元组,一组一组的,可以转化为列表或元组。这里要强调一下,Python2和Python3中返回的zip对象有所不同。 Python3中zip()函数不再返回list对象,但是可以通过list强行转换。(类似的函数变化还有dictionary关联的keys()values()items()map()filter())。

打包 zip(iterables)

上面的代码使用的环境是Python3.6,其中list(z)操作就是强制转换。注意一个问题,a和b这两个列表是不同长短的,这时候zip函数就会匹配完最短的那个便结束。 当zip函数的参数只有一个时,它将从iterable中依次取一个元素,组成一个元组。

解包 zip(*iterables)

解包,zip 相反,可理解为解压,返回多维矩阵形式,有几个组元素就返回几维的。 比如,下面我是用三个列表组合起来的迭代式,那么解压后就返回三维的矩阵。

zip高级用法

讲完了基本的再来说一下该函数的高级用法。高级用法离不开一个词:Pythonic,就是将代码写的更优雅美观,看起来有逼格!

  1. 列表推导 例如:
a = [1,2,3,4]
b = [5,6,7,8]

我们要同时遍历a、b,且要对它们进行操作,那就要放在同一个for循环内,zip函数正好合适。 注意:如果是Python2环境中,要使用izip才能提高效率。 当然,如果你需要对下标进行操作,那么还需要加上enumerate函数。 2. 使用zip创建键值对 zip方法返回的是一个元组,用它来创建键值对,简单明了。

python zip 是什么

zip就是把2个数组糅在一起。

x = [1, 2, 3, 4, 5]
y = [6, 7, 8, 9, 10]

zip(x, y)就得到了:

[(1, 6), (2, 7), (3, 8), (4, 9), (5, 10)]

比如你有2组坐标,你想两两对应的相加,那么zip函数就很有用了。 再比如,你有2个数组A,B,A存了班级里的人的名字,B是每个人的考试分数,你需要通过某个人的名字来查考试分数,那你需要一个字典,zip可以很方便地帮你建立字典:

x = ['bob','tom','kitty']
y = [80,90,95]
d = dict(zip(x,y))
# [('bob', 80), ('tom', 90), ('kitty', 95)]
d['bob']
# 返回80,多方便啊

Python 之内置函数:filter、map、reduce、zip、enumerate

这几个函数在 Python 里面被称为高阶函数,本文主要学习它们的用法。

filter

函数原型如下:

filter(function, iterable)

第一个参数是判断函数(返回结果需要是 True 或者 False),第二个为序列,该函数将对 iterable 序列依次执行 function(item) 操作,返回结果是过滤之后结果组成的序列。 简单记忆:对序列中的元素进行筛选,获取符合条件的序列。 返回结果为:filter object,使用 list 函数可以输出序列内容。

map

函数原型如下:

map(function, iterable, ...)

该函数运行之后生成一个 list,第一个参数是函数、第二个参数是一个或多个序列; 下述代码是一个简单的测试案例:

my_new_list = map(lambda x: x * 2, [1, 2, 3])

上述代码运行完毕,得到的结果是:map object。使用 print(list(my_new_list)) 可以得到结果。 map 函数的第一个参数,可以有多个参数,当这种情况出现后,后面的第二个参数需要是多个序列。 map 函数解决的问题:

reduce

函数原型如下:

reduce(function, iterable[, initializer])

第一个参数是函数,第二个参数是序列,返回计算结果之后的值。该函数价值在于滚动计算应用于列表中的连续值。 测试代码如下:

from functools import reduce
result = reduce(lambda x, y: x + y, [1, 2, 3, 4])

最终的结果是 10,如果设置第三个参数为 4,可以运行代码查看结果,最后得到的结论是,第三个参数表示初始值,即累加操作初始的数值。 简单记忆:对序列内所有元素进行累计操作。

zip

函数原型如下:

zip(*iterables)

zip 函数将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。 如果各个迭代器的元素个数不一样,则返回列表长度与最短的对象相同,利用星号(*)操作符,可以将元组解压为列表。 测试代码如下:

a = [1, 2, 3]
b = [4, 5, 6]
zipped = zip(a, b)
# [(1, 4), (2, 5), (3, 6)]

展示如何利用 * 操作符:

unzipped = zip(*zipped)
# [(1, 2, 3), (4, 5, 6)]

输出结果如下:

[(1, 2, 3), (4, 5, 6)]

简单记忆:zip 的功能是映射多个容器的相似索引,可以方便用于来构造字典。

enumerate

函数原型如下:

enumerate(iterable, start=0)

参数说明: 该函数用于将一个可遍历的数据对象组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。 测试代码如下:

for index, value in enumerate(['a', 'b', 'c']):
    print(index, value)

返回结果为:

0 a
1 b
2 c

本文涉及的函数可以与 lambda 表达式进行结合,能大幅度提高编码效率。最好的学习资料永远是官方手册。