python3之python的核心数据类型(列表)

python3之python的核心数据类型(列表)
----------

python的列表对象是这个语言提供的最通用的序列。列表是一个任意类型的对象的位置相关的有序集合,它没有固定的大小。不像字符串,其大小是可变的,通过对偏移量进行赋值以及其他各种列表的方法进行调用,确实能够修改列表的大小。


1 序列操作

由于列表是序列的一种,列表支持所有的我们对字符串所讨论过的序列操作。唯一的区别就是其结果往往是列表而不是字符串。例如:

  >>>L=[123,'spam',1.23]
  >>>len(L)
  3
我们能够对列表进行索引、切片等操作,就像对字符串所做的操作那样:

  >>>L[0]
  123
  >>>L[:-1]
  [123,'spam']
  >>>L+[4,5,6]
  [123,'spam',1.23,4,5,6]
  >>>L
  [123,'spam',1.2.3]


2 类型特定的操作
python中的列表与其他语言中的数组有些类似,但是列表要强大得多。其中一个方面就是, 列表没有固定类型的约束。例如,上个例子中接触到的列表,包含了三个完全不同类型的对象(一个整数、一个字符串,以及一个浮点数)。此外, 列表没有固定大小,也就是说能够按照需要增加或减少列表大小,来响应其特定的操作:
  >>>L.append("NI")
  >>>L
  [123,'spam',1.23,'NI']
  >>>L.pop(2)
  1.23
  >>>L
  [123,'spam','NI']
这里,列表的append方法扩充了列表的大小并在列表的尾部插入一项;pop方法(或者等效的del语句)移除给定偏移量的一项,从而让列表减小。其他的列表方法可以在任意位置插入(insert)元素,按照值移除(remove)元素等。因为列表是可变的,大多数列表的方法都会就地改变列表对象,而不是创建一个新的列表:

  >>>M=['bb','aa','cc']
  >>>M.sort()
  >>>M
  ['aa','bb','cc']
  >>>M.reverse()
  >>>M
  ['cc','bb','aa']
例如,这里的列表sort方法,默认按照升序对列表进行排序,而reverse对列表进行翻转。这种情况下,这些方法都直接对列表进行了改变。
  
3 边界检查
尽管列表没有固定的大小, python仍不允许引用不存在的元素。超出列表末尾之外的索引总是会导致错误。对列表末尾范围之外赋值也是如此
  >>>L
  [123,'spam','NI']
  >>>L[99]
  ...error text omitted...
  IndexError: list index out of range
  >>>L[99]=1
  ...error text omitted...
  IndexError: list assignment index out of range
这是有意而为之的,由于去给一个列表边界外的元素赋值,往往会得到一个错误(而在C语言中情况比较糟糕,因为它不会像python这样进行错误检查)。在python中,并不是默默地增大列表作为响应,而是会提示错误。为了让一个列表增大,我们可以调用append这样的列表方法。
  
4 嵌套
python核心数据类型的一个优秀的特性就是 它们支持任意的嵌套能够以任意的组合对其进行嵌套,并可以多个层次进行嵌套(例如,能够让一个列表包含一个字典,并在这个字典中包含另一个列表等)。这种特性的一个直接的应用就是实现矩阵,或者python中的"多维数组"。一个嵌套列表的列表能够完成这个基本的操作:
  >>>M=[[1,2,3],
        [4,5,6],
        [7,8,9]]
  >>>M
  [[1,2,3],[4,5,6],[7,8,9]]
  >>>M[1]
  [4,5,6]
  >>>M[1][2]
  >>>6
这里的第一个操作读取了整个第二行,第二个操作读取了那行的第三个元素。串联起索引操作可以逐层深入地获取嵌套的对象结构。
  
5 列表解析
处理序列的操作和列表的方法中, python还包括了一个更高级的操作,称作列表解析表达式,从而提供了一种处理像矩阵这样结构的强大工具。例如,假设我们需要从列举的矩阵中提取出第二列。因为矩阵是按照行进行存储的,所以通过简单的索引即可获取行,使用列表解析时可以同样简单地获得列。
  >>> col2=[row[1] for row in M]
  >>> col2
  [2,5,8]
  >>>M
  [[1,2,3],[4,5,6],[7,8,9]]
列表解析源自集合的概念。它是一种通过对序列中的每一项运行一个表达式来创建一个新列表的方法,每次一个,从左到右。列表解析是编写在广括号中的(提醒你在创建列表这个事实),并且由使用了同一个变量名的 (这里是row)表达式和循环结构组成。之前的这个列表解析表达基本上就是它字面上所讲的: "把矩阵M的每个row中的row[1],放在一个新的列表中"。其结果就是一个包含了矩阵的第二列的新列表。 实际应用中的列表解析可以更复杂:
  >>>[row[1]+1 for row in M]
  [3,6,9]
  >>>[row[1] for row in M if row[1]%2==0]
  [2,8]
例如,这里的第一个操作,把它搜集到的每一个元素都加了1,第二个使用了一个if条件语句,通过使用%求余表达式(取余数)过滤了结果中的奇数。列表解析创建了新的列表作为结果,但是能够在任何可迭代的对象上进行迭代。又例:
  >>>diag=[M[i][i] for i in [0,1,2]]
  >>>diag
  [1,5,9]
  >>>doubles=[c*2 for c in 'spam']
  ['ss','pp','aa','mm']
列表解析以及相关的内容函数map和filter比较复杂,这里就不多讲述了,这里简要说明的目的是描绘出python中有简单的工具,也有高级的工具。列表解析是一个可选的特性,在实际应用中比较方便,并常常具有处理速度上的优势。
实际上,在python3.0中,列表、集合和字典都可以用解析来创建,如例:
  >>>[ord(x) for x in 'spam']
  [115,112,97,109]
  >>>{ord(x) for x in 'spam'}
  {112,97,115,109}
  >>>{x:ord(x) for x in 'spam'}
  {'a':97,'p':112,'s':115,'m':109}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值