Python元组与列表_元组与字典

一,元组与列表

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,接收一个序列然后返回一个以逆序迭代整个列表的迭代器。

结束。

原文地址:https://www.cnblogs.com/liusingbon/p/13210106.html