离线下载
PDF版 ePub版

老齐 · 更新于 2018-06-22 09:01:27

列表(1)

前面的学习中,我们已经知道了两种 Python 的数据类型:int 和 str。再强调一下对数据类型的理解,这个世界是由数据组成的,数据可能是数字(注意,别搞混了,数字和数据是有区别的),也可能是文字、或者是声音、视频等。在 Python 中(其它高级语言也类似)把状如 2,3 这样的数字划分为一个类型,把状如“你好”这样的文字划分一个类型,前者是 int 类型,后者是 str 类型(这里就不说翻译的名字了,请看官熟悉用英文的名称,对日后编程大有好处,什么好处呢?谁用谁知道!)。

前面还学习了变量,如果某个变量指向一个对象(某种类型的数据)行话是:赋值),通常这个变量我们就把它叫做 int 类型的变量(注意,这种说法是不严格的,或者是受到别的语言影响的,在 Python 中,特别要注意:变量没有类型,对象有类型。在 Python 里,变量不用提前声明(在某些语言,如 JAVA 中需要声明变量之后才能使用。这个如果看官没有了解,不用担心,因为我们是学习 Python,以后学习的语言多了,自然就能体会到这点区别了),随用随命名。

这一讲中的 list 类型,也是 Python 的一种数据类型。翻译为:列表。下面的黑字,请看官注意了:

LIST 在 Python 中具有非常强大的功能。

定义

在 Python 中,用方括号表示一个 list,[ ]

在方括号里面,可以是 int,也可以是 str 类型的数据,甚至也能够是 True/False 这种布尔值。看下面的例子,特别注意阅读注释。

>>> a=[]        #定义了一个变量 a,它是 list 类型,并且是空的。
>>> type(a)
<type 'list'>   #用内置函数 type()查看变量 a 的类型,为 list
>>> bool(a)     #用内置函数 bool()看看 list 类型的变量 a 的布尔值,因为是空的,所以为 False
False
>>> print a     #打印 list 类型的变量 a
[]

bool()是一个布尔函数,这个东西后面会详述。它的作用就是来判断一个对象是“真”还是“空”(假)。如果想上面例子那样,list 中什么也没有,就是空的,用 bool()函数来判断,得到 False,从而显示它是空的。

不能总玩空的,来点实的吧。

>>> a=['2',3,'qiwsir.github.io']
>>> a
['2', 3, 'qiwsir.github.io']
>>> type(a)
<type 'list'>
>>> bool(a)
True
>>> print a
['2', 3, 'qiwsir.github.io']

用上述方法,定义一个 list 类型的变量和数据。

本讲的标题是“有容乃大的 list”,就指明了 list 的一大特点:可以无限大,就是说 list 里面所能容纳的元素数量无限,当然这是在硬件设备理想的情况下。

如果看官以后或者已经了解了别的语言,比如比较常见的 Java,里面有一个跟 list 相似的数据类型——数组——但是两者还是有区别的。在 Java 中,数组中的元素必须是基本数据类型中某一个,也就是要么都是 int 类型,要么都是 char 类型等,不能一个数组中既有 int 类型又有 char 类型。这是因为 java 中的数组,需要提前声明,声明的时候就确定了里面元素的类型。但是 python 中的 list,尽管跟 java 中的数组有类似的地方——都是[]包裹的—— list 中的元素是任意类型的,可以是 int,str,甚至还可以是 list,乃至于是以后要学的 dict 等。所以,有一句话说:List 是 python 中的苦力,什么都可以干。

索引和切片

尚记得在《字符串(3)》中,曾经给“索引”(index)和“切片”。

>>> url = "qiwsir.github.io"
>>> url[2]
'w'
>>> url[:4]
'qiws'
>>> url[3:9]
'sir.gi'

在 list 中,也有类似的操作。只不过是以元素为单位,不是以字符为单位进行索引了。看例子就明白了。

>>> a
['2', 3, 'qiwsir.github.io']
>>> a[0]    #索引序号也是从 0 开始
'2'
>>> a[1]
3
>>> [2]
[2]
>>> a[:2]   #跟str中的类似,切片的范围是:包含开始位置,到结束位置之前
['2', 3]    #不包含结束位置
>>> a[1:]
[3, 'qiwsir.github.io']

list 和 str 两种类型的数据,有共同的地方,它们都属于序列(都是一些对象按照某个次序排列起来,这就是序列的最大特征),因此,就有很多类似的地方。如刚才演示的索引和切片,是非常一致的。

>>> lang = "python"
>>> lang.index("y")
1
>>> lst = ['python','java','c++']
>>> lst.index('java')
1

在前面讲述字符串索引和切片的时候,以及前面的演示,所有的索引都是从左边开始编号,第一个是 0,然后依次增加 1。此外,还有一种编号方式,就是从右边开始,右边第一个可以编号为 -1,然后向左依次是:-2,-3,...,依次类推下来。这对字符串、列表等各种序列类型都是用。

>>> lang
'python'
>>> lang[-1]
'n'
>>> lst
['python', 'java', 'c++']
>>> lst[-1]
'c++'

从右边开始编号,第 -1 号是右边第一个。但是,如果要切片的话,应该注意了。

>>> lang[-1:-3]
''
>>> lang[-3:-1]
'ho'
>>> lst[-3:-1]
['python', 'java']

序列的切片,一定要左边的数字小有右边的数字,lang[-1:-3]就没有遵守这个规则,返回的是一个空。

反转

这个功能作为一个独立的项目提出来,是因为在编程中常常会用到。通过举例来说明反转的方法:

>>> alst = [1,2,3,4,5,6]
>>> alst[::-1]    #反转
[6, 5, 4, 3, 2, 1]
>>> alst
[1, 2, 3, 4, 5, 6]

当然,对于字符串也可以

>>> lang
'python'
>>> lang[::-1]
'nohtyp'
>>> lang
'python'

看官是否注意到,上述不管是 str 还是 lst 反转之后,再看原来的值,没有改变。这就说明,这里的反转,不是在“原地”把原来的值倒过来,而是新生成了一个值,那个值跟原来的值相比,是倒过来了。

这是一种非常简单的方法,虽然我在写程序的时候常常使用,但是,我不是十分推荐,因为有时候让人感觉迷茫。Python 还有另外一种方法让list反转,是比较容易理解和阅读的,特别推荐之:

>>> list(reversed(alst))
[6, 5, 4, 3, 2, 1]

比较简单,而且很容易看懂。不是吗?

顺便给出 reversed 函数的详细说明:

>>> help(reversed)
Help on class reversed in module __builtin__:

class reversed(object)
 |  reversed(sequence) -> reverse iterator over values of the sequence
 |  
 |  Return a reverse iterator

它返回一个可以迭代的对象(关于迭代的问题,后续会详述之),不过是已经将原来的序列对象反转了。比如:

>>> list(reversed("abcd"))
['d', 'c', 'b', 'a']

很好,很强大,特别推荐使用。

对 list 的操作

任何一个行业都有自己的行话,如同古代的强盗,把撤退称之为“扯乎”一样,纵然是一个含义,但是强盗们愿意用他们自己的行业用语,俗称“黑话”。各行各业都如此。这样做的目的我理解有两个,一个是某种保密;另外一个是行外人士显示本行业的门槛,让别人感觉这个行业很高深,从业者有一定水平。

不管怎么,在 Python 和很多高级语言中,都给本来数学角度就是函数的东西,又在不同情况下有不同的称呼,如方法、类等。当然,这种称呼,其实也是为了区分函数的不同功能。

前面在对 str 进行操作的时候,有一些内置函数,比如 s.strip(),这是去掉左右空格的内置函数,也是 str 的方法。按照一贯制的对称法则,对 list 也会有一些操作方法。

在讲述字符串的时候,提到过,所有的序列,都有几种基本操作。list 当然如此。

基本操作

  • len()

在交互模式中操作:

>>> lst
['python', 'java', 'c++']
>>> len(lst)
3
  • +,连接两个序列

交互模式中:

>>> lst
['python', 'java', 'c++']
>>> alst
[1, 2, 3, 4, 5, 6]
>>> lst + alst
['python', 'java', 'c++', 1, 2, 3, 4, 5, 6]
  • *,重复元素

交互模式中操作

>>> lst
['python', 'java', 'c++']
>>> lst * 3
['python', 'java', 'c++', 'python', 'java', 'c++', 'python', 'java', 'c++']
  • in

列表 lst 还是前面的值

>>> "python" in lst
True
>>> "c#" in lst
False
  • max()和 min()

以 int 类型元素为例。如果不是,都是按照字符在 ascii 编码中所对应的数字进行比较的。

>>> alst
[1, 2, 3, 4, 5, 6]
>>> max(alst)
6
>>> min(alst)
1
>>> max(lst)
'python'
>>> min(lst)
'c++'
  • cmp()

采用上面的方法,进行比较

>>> lsta = [2,3]
>>> lstb = [2,4]
>>> cmp(lsta,lstb)
-1
>>> lstc = [2]
>>> cmp(lsta,lstc)
1
>>> lstd = ['2','3']
>>> cmp(lsta,lstd)
-1

追加元素

>>> a = ["good","python","I"]      
>>> a
['good', 'python', 'I']
>>> a.append("like")        #向 list 中添加 str 类型 "like"
>>> a
['good', 'python', 'I', 'like']
>>> a.append(100)           #向 list 中添加 int 类型 100
>>> a
['good', 'python', 'I', 'like', 100]

官方文档这样描述 list.append()方法

list.append(x)

Add an item to the end of the list; equivalent to a[len(a):] = [x].

从以上描述中,以及本部分的标题“追加元素”,是不是能够理解 list.append(x)的含义呢?即将新的元素 x 追加到 list 的尾部。

列位看官,如果您注意看上面官方文档中的那句话,应该注意到,还有后面半句: equivalent to a[len(a):] = [x],意思是说 list.append(x)等效于:a[len(a):]=[x]。这也相当于告诉我们了另外一种追加元素的方法,并且两种方法等效。

>>> a
['good', 'python', 'I', 'like', 100]
>>> a[len(a):]=[3]      #len(a),即得到 list 的长度,这个长度是指 list 中的元素个数。
>>> a
['good', 'python', 'I', 'like', 100, 3]
>>> len(a)
6
>>> a[6:]=['xxoo']
>>> a
['good', 'python', 'I', 'like', 100, 3, 'xxoo']

总目录   |   上节:字符编码   |   下节:列表(2)

如果你认为有必要打赏我,请通过支付宝:qiwsir@126.com,不胜感激。

上一篇: 字符编码 下一篇: 列表(2)