zip 和 map (python基础通过系列)


在这里插入图片描述

zip

zip() 是Python内置函数之一,它将一个或多个可迭代对象作为参数,并返回一个元组的列表,将这些序列中的并排的元素配成对。

例如,假设我们有两个列表:

L1 = [1, 2, 3, 4]
L2 = [5, 6, 7, 8]

要合并这些列表中的元素,可以使用 zip 来创建一个元组对的列表,如下:

In [1]: L1 = [1, 2, 3, 4]

In [2]: L2 = [5, 6, 7, 8]

In [3]: zip(L1,L2)
Out[3]: <zip at 0x18ca0a22600>

zip 在 python3 中也是一个可迭代对象,我们要一次性显示所有的结果,要用 list 将它转换为列表:

In [4]: list(zip(L1,L2))
Out[4]: [(1, 5), (2, 6), (3, 7), (4, 8)]

使用案例

搭配 for 循环使用:

In [5]: for (x, y) in list(zip(L1, L2)): print(x, y, '---', x+y)
1 5 --- 6
2 6 --- 8
3 7 --- 10
4 8 --- 12

首先我们从两个列表L1 和 L2 中提取元素进行配对。这个for 循环在这里使用元组赋值运算以解包 zip 的结果中的每个元组。第一次迭代时,就好像执行了赋值语句 (x, y) = (1, 5)

zip 可以接受任何类型的序列(其实就是任何可迭代对象,包括文件),并且可以有两个以上的参数。三个参数的案例如下:

In [1]: T1, T2, T3 = (1,2,3), (4,5,6), (7,8,9)

In [2]: T3
Out[2]: (7, 8, 9)

In [3]: list(zip(T1, T2, T3))
Out[3]: [(1, 4, 7), (2, 5, 8), (3, 6, 9)]

上面的例子使用 zip 构建了 3 元素元组的一个列表,其中带有来自每个序列的元素,基本上按照列来对应,最后调用 list 将其一次性显示出来。

当参数长度不同是,zip 会以最短序列的长度为准来截断所得到的元组,如下:

In [4]: S1 = 'abc'

In [5]: S2 = 'xyz123'

In [6]: list(zip(S1, S2))
Out[6]: [('a', 'x'), ('b', 'y'), ('c', 'z')]

上面的例子中我们将两个字符串zip到一起以并行地选取字符,但是结果所拥有的元组数只和最短的序列的长度一致。


map

map() 函数时python的内置函数之一,它接受一个函数和一个或多个可迭代对象作为输入,然后对每个可迭代对象中的元素依次应用这个函数,返回一个将函数应用于每个元素后的结果的迭代器。

使用案例

In [7]: map(ord, 'xyl')
Out[7]: <map at 0x27b610ed3f0>

In [8]: list(map(ord, 'xyl'))
Out[8]: [120, 121, 108]

上面的例子中,ord是python的一个内置函数,该函数接受一个字符作为参数,并返回其对应的Unicode值。例如 ord('A') 将返回 65。

上面代码代码也可以使用 for 循环来实现,但是使用map通常会比for循环要快一些:

In [9]: res = []

In [10]: for c in 'xyl': res.append(ord(c))

In [11]: res
Out[11]: [120, 121, 108]

使用 zip 来构造字典

我们可以编写字典常量或者不时的对键进行赋值来创建字典,如下:

In [12]: D1 = {"name":"Andy", "Age":18, "City":"ShangHai"}

In [13]: D1
Out[13]: {'name': 'Andy', 'Age': 18, 'City': 'ShangHai'}

In [14]: D1 = {}

In [15]: D1
Out[15]: {}

In [16]: D1['language'] = 'Chinese'

In [17]: D1['favorite'] = 'basketball'

In [18]: D1
Out[18]: {'language': 'Chinese', 'favorite': 'basketball'}

如果你的程序是在脚本写好后,在运行时,动态获得字典键和值的列表,那应该怎么做?假设你又下列键和值的列表:

In [19]: keys = ['Name', 'Age', 'City']

In [20]: vals = ['Andy', 18, 'BeiJing']

将这些列表变成字典的一种做法是将这些字符串 zip 起来,并通过 for 循环并行步进处理:

In [21]: list(zip(keys, vals))
Out[21]: [('Name', 'Andy'), ('Age', 18), ('City', 'BeiJing')]

In [22]: D2 = {}

In [23]: for (k,v) in zip(keys, vals): D2[k] = v

In [24]: D2
Out[24]: {'Name': 'Andy', 'Age': 18, 'City': 'BeiJing'}

我们还有一个更简单的做法,直接将 zip 过的 键/值 列表传给内置的 dict 构造函数:

In [25]: keys = ['Name', 'Age', 'City']

In [26]: vals = ['Andy', 18, 'BeiJing']

In [27]: dict(zip(keys, vals))
Out[27]: {'Name': 'Andy', 'Age': 18, 'City': 'BeiJing'}

dict() 可以将列表转换为字典。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值