文章目录
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()
可以将列表转换为字典。