老王python之基本数据结构——列表

老王python之基本数据结构——列表

1、列表的四个基本特点

  • ### 1. 有序的集合
  • ### 2. 通过偏移来索引,从而读取数据
>>> a = [1,2,3,4]
>>> a[1]
2
  • ### 3. 支持嵌套
>>> b = [[1,2,3],[4,5,6]]
>>> b
[[1, 2, 3], [4, 5, 6]]
  • ### 4. 可变类型
>>> id(b)
139767049435184
>>> b[0][1] = 7
>>> b
[[1, 7, 3], [4, 5, 6]]
>>> id(b)
139767049435184

2、列表的切片

  • ### 1. 正向索引
    • 正向索引是从左向右索引,格式为list[startindex:endindex:step]
>>> a = [1,2,3,4,5,6,7]
>>> a[1:4:1]
[2, 3, 4]
  • ### 2. 反向索引
    • 反向索引是从右向左索引,格式和正向索引相同,不过最后一个的index为-1

      >>> a[-1:-4:-1]
      [7, 6, 5]
  • ### 3. 默认索引
    • 默认索引表示想要哪些数值,就把哪些数值表示出来,格式也和正向索引相同,比如下面的python shell中表示想要把列表a中的2,4,6拿出来

      >>> a[1::2] #表示从索引为1的开始,一直到列表结束,步长为2
      [2, 4, 6]

3、列表的添加操作

  • ### 1. +
    生成一个新的列表

    >>> a = [1,2,3]
    >>> a+b
    [1, 2, 3, 4, 5, 6]
  • ### 2. extend
    接受参数并将该参数的每个元素都添加到原有的列表中,原地修改列表而不是新建列表,格式为L.extend(iterable)

    >>> id(a)
    139767048765520
    >>> a.extend(b)
    >>> a
    [1, 2, 3, 4, 5, 6]
    >>> id(a) #通过id查看可以看出,添加之后的列表还是a,并不是新建了一个列表
    139767048765520
  • ### 3. append
    添加任意对象到列表的末端,格式为L.qppend(object)
>>> a = [1,2,3]
>>> a.append(4)
>>> a
[1, 2, 3, 4]
>>> a.append([4,5,6])
>>> a
[1, 2, 3, 4, [4, 5, 6]]
  • ### 4. insert
    插入任意对象到列表中,可以控制插入的位置,格式为L.insert(index,object)
>>> a.insert(1,'ab')
>>> a
[1, 'ab', 2, 3, 4, [4, 5, 6]]

4、列表的修改操作

  • 修改列表本身只需要直接赋值即可
>>> a = [1,2,3]
>>> a[1] = 'python'
>>> a
[1, 'python', 3]

5、列表的删除操作

  • ### 1. del
    通过索引删除指定位置的元素
>>> a = [1,2,3,4,4]
>>> del a[0]
>>> a
[2, 3, 4, 4]
  • ### 2. remove
    格式为L.remove(value),直接删除指定的列表元素值,移除列表中指定值的第一个匹配值。如果没有找到的话,抛出异常
>>> a
[2, 3, 4, 4]
>>> a.remove(4)
>>> a
[2, 3, 4]
>>> a.remove(5)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: list.remove(x): x not in list
  • ### 3. pop
    格式为L.pop([index]),index默认为最后一个,返回最后一个元素,并从list中删除它
>>> a
[2, 3, 4]
>>> a.pop()
4
>>> a
[2, 3]

6、列表的成员关系

in ,not in可以用来判断一个元素是否再列表中,返回一个bool类型,如果是用in来判断的话,如果元素在列表里面,返回True,否则返回Falsse;用not in判断的话,结果刚好相反

>>> a = [1,2,3]
>>> 1 in a
True
>>> 4 in a
False
>>> 3 not in a
False
>>> 5 not in a
True

7、列表推导式

  • ### 1. 常用的列表推导式
    • 结构为[expr for iter_var in iterable],expr表示的是表达式,iner_var表示迭代变量,iterable表示迭代器
    • 定义:首先定义迭代器iterable里所有内容,每一次迭代,都把迭代器iterable里的所有内容放入到迭代变量iter_var中,再到表达式expr中应用迭代变量iter_var的内容,最后用表达式的计算值生成一个列表
##比如要生成一个1到10的列表
>>> [x for x in range(1,11)]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> range(1,11)   #range(start,end[,step]),步长step默认为1
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  • ### 2. 加入判断语句的列表推导式
    • 结构为[expr for iter_var in iterable if cond_expr]
    • 定义:只有满足条件的内容才把iterable里对应的内容放到iter_var中,再再表达式中应用iter_var中的内容,最后用表达式的计算值生成一个列表

      ##比如要生成一个1到10的奇数列表
      >>> range(1,11,2)
      [1, 3, 5, 7, 9]
      >>> [x for x in range(1,11) if x % 2 == 1]
      [1, 3, 5, 7, 9]

8、列表的排序翻转

列表的排序翻转主要用的是sort和reverse,这个方法直接修改原列表
- ### 1. sort
正序排序,直接修改原列表,所以它的返回值为None

>>> a = [22,11,33,44]
>>> b = a.sort()
>>> b
>>> a
[11, 22, 33, 44]
  • ### 2. reverse
    翻转,也是原地进行翻转,返回值为None
>>> a
[11, 22, 33, 44]
>>> a.reverse()
>>> a
[44, 33, 22, 11]

列表扩展(应用)

1、内置list方法

返回一个列表,参数是可迭代对象。输出的内容还是保持了传入的可迭代对象的元素和顺序,如果参数为空,则返回一个空的列表

>>> a = 'asd'
>>> list(a)
['a', 's', 'd']
>>> b = ''
>>> list(b)
[]

2、xrange和range的区别

  • 2.1 xrange用法

    用法为xrange(start,end[, step]),步长step默认为1

    xrange直接生成一个xrange对象

    >>> a = xrange(1,10)
    >>> a
    xrange(1, 10)
  • 2.2 xrange和range的区别

    • range:直接生成一个列表对象
    • xrange:直接生成一个xrange对象
  • 2.3 xrange主要用处

    • 当我们需要一个非常大的数据,并且内存比较吃紧的时候,我们可以用xrange来操作节省内存
    • xrange一般用在循环里面,比如我们只需要操作部分数据,而不用返回全部元素来完成操作,推荐使用xrange

3、列表推导式再应用

  • ### 例题
    • 1、取出1-100所有值的平方
>>> [x*x for x in range(1,101)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400, 441, 484, 529, 576, 625, 676, 729, 784, 841, 900, 961, 1024, 1089, 1156, 1225, 1296, 1369, 1444, 1521, 1600, 1681, 1764, 1849, 1936, 2025, 2116, 2209, 2304, 2401, 2500, 2601, 2704, 2809, 2916, 3025, 3136, 3249, 3364, 3481, 3600, 3721, 3844, 3969, 4096, 4225, 4356, 4489, 4624, 4761, 4900, 5041, 5184, 5329, 5476, 5625, 5776, 5929, 6084, 6241, 6400, 6561, 6724, 6889, 7056, 7225, 7396, 7569, 7744, 7921, 8100, 8281, 8464, 8649, 8836, 9025, 9216, 9409, 9604, 9801, 10000]
- 2、**生成的不止是数字**
    - 2.1 生成字符串

    ```
    >>> ['this %s' % x for x in range(10)]
    ['this 0', 'this 1', 'this 2', 'this 3', 'this 4', 'this 5', 'this 6', 'this 7', 'this 8', 'this 9']
    ```

    - 2.2 生成元组

    ```
    >>> [(x,y) for x in range(4) for y in range(2)]
[(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1), (3, 0), (3, 1)]
    ```
    - 2.3 生成字典
    ```
    >>> dict([(x,y) for x in range(4) for y in range(2)])
{0: 1, 1: 1, 2: 1, 3: 1}
    ```

4、再谈引用

>>> a = ['i','am','hanmeimei']
>>> b = a
>>> a
['i', 'am', 'hanmeimei']
>>> id(a)
139767049512864
>>> id(b)       ##说明b和a引用的是同一段列表对象
139767049512864
>>> b[2] = 'lilei'
>>> b       #列表可以在原地进行修改,并且它们指向同一段列表对象
['i', 'am', 'lilei']
>>> id(b)
139767049512864
>>> a
['i', 'am', 'lilei']

>>> del b       #就是删除了对这一段列表对象的一次引用
>>> a
['i', 'am', 'lilei']

5、再议删除

  • del a:删除列表对象的引用
  • del a[:]:清空列表对象里的元素
>>> a = [1,2,3]
>>> b = a
>>> del a
>>> a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
>>> b           #只是删除了列表对象的一次引用
[1, 2, 3]
>>> c = b
>>> del c[:]
>>> c
[]
>>> b           #把该列表对象里面的元素全部删除
[]

猜你喜欢

转载自blog.csdn.net/lcl_xiaowugui/article/details/80764970