一,元组与列表
zip 是一个内置函数,接收两个或更多的序列作为参数,然后返回一个元组列表,该列表中每个元组都包含了从各个序列中的一个元素。
1.下面这个例子中,一个字符串和一个列表通过zip这个函数连接到了一起:
>>> s = 'abc'
>>> t = [0, 1, 2]
>>> zip(s, t)
<zip object at 0x10bf130c8>
该函数的返回值是一个 zip 对象,该对象可以用来迭代所有的数值对。
2.zip 函数经常被用到 for 循环中:
>>> for pair in zip(s, t):
... print(pair)
...
('a', 0)
('b', 1)
('c', 2)
zip 对象是一种迭代器,也就是某种可以迭代整个序列的对象。迭代器和列表有些相似,但不同于列表的是,你无法通过索引来选择迭代器中的指定元素。
3.如果想用列表的运算符和方法,可以用 zip 对象来构成一个列表:
>>> list(zip(s, t))
[('a', 0), ('b', 1), ('c', 2)]
返回值是一个由元组构成的列表;在这个例子中,每个元组都包含了字符串中的一个字母,以及列表中对应位置的元素。
4.在长度不同的序列中,返回的结果长度取决于最短的一个:
>>> list(zip('apple', 'orange'))
[('a', 'o'), ('p', 'r'), ('p', 'a'), ('l', 'n'), ('e', 'g')]
上例中orange单词的最后一个字母e就没有返回。
5.用 for 循环来遍历一个元组列表的时候,可以用元组赋值语句:
>>> t = [('a', 0), ('b', 1), ('c', 2)]
>>> for letter, number in t:
... print(letter, number)
...
a 0
b 1
c 2
每次经历循环的时候,Python都选中列表中的下一个元组,然后把元素赋值给字母和数字。
6.如果结合使用 zip、for 循环以及元组赋值,就能得到一种能同时遍历两个以上序列的代码组合。
比如下面例子中的 has_match 这个函数,接收两个序列t1和 t2作为参数,然后如果存在一个索引位置 i 使得 t1[i] == t2[i]就返回真:
>>> def has_match(t1, t2):
... for x, y in zip(t1, t2):
... if x==y:
... return True
... return False
...
>>> t1 = [1, 0, 3]
>>> t2 = [2, 0, 4]
>>> print(has_match(t1, t2))
True
7.如果你要遍历一个序列中的所有元素以及它们的索引,可以用内置的函数 enumerate:
>>> for index, element in enumerate('abc'):
... print(index, element)
...
0 a
1 b
2 c
enumerate 函数的返回值是一个枚举对象,它会遍历整个成对序列;每一对都包括一个索引以及给定序列的一个元素(索引从0开始)。
二,元组与字典
1.字典有一个名为 items 的方法,会返回一个由元组组成的序列,每一个元组都是字典中的一个键值对。
>>> d = {'a':0, 'b':1, 'c':2}
>>> t = d.items()
>>> t
dict_items([('a', 0), ('b', 1), ('c', 2)])
执行结果是一个 dict_items 对象,这是一个迭代器,迭代所有的键值对。可以在 for 循环里面用这个对象,如下所示:
>>> for key, values in d.items():
... print(key, values)
...
a 0
b 1
c 2
2.反过来使用的话,也可以用一个元组的列表来初始化一个新的字典:
>>> t = [('a', 0), ('c', 2), ('b', 1)]
>>> d = dict(t)
>>> d
{'a': 0, 'c': 2, 'b': 1}
3.结合使用 dict 和 zip ,会得到一种建立字典的简便方法:
>>> d = dict(zip('abc', range(3)))
>>> d
{'a': 0, 'b': 1, 'c': 2}
三,序列组成的序列
很多情况下,不同种类的序列(字符串、列表和元组)是可以交换使用的。那么该如何选择,用哪种序列呢?
1.先从最简单的开始,字符串比起其他序列,功能更加有限,因为字符串中的元素必须是字符。而且还不能修改。如果你要修改字符串里面的字符(而不是要建立一个新字符串),你最好还是用字符列表吧。
2.列表用的要比元组更广泛,主要因为列表可以修改。但以下这些情况下,你还是用元组更好:
a. 在某些情况下,比如返回语句中,用元组来实现语法上要比列表简单很多。
b. 如果你要用一个序列作为字典的键,必须用元组或者字符串这些不可修改的类型才行。
c. 如果你要把一个序列作为参数传给一个函数,用元组能够降低一些风险,即由于别名使用而导致的未知情况。
3. 由于元组是不可修改的,所以不提供 sort 和 reverse 这样的方法,这些方法都只能修改已经存在的列表。但 Python 提供了内置函数 sorted,该函数接收任意序列,然后返回一个把该序列中元素重新排序过的列表,另外还有个内置函数 reversed,接收一个序列然后返回一个以逆序迭代整个列表的迭代器。
结束。