python数据结构简记

一、python数据结构:
1)List:可更改的类型,下面是List的一些方法:
  1、list.append(x):把一个元素添加到列表的结尾,a[len(a):] = [x]。
  2、list.extend(L):通过添加指定列表的所有元素来扩充列表,相当于 a[len(a):] = L。
  3、list.insert(i,x):在指定位置插入一个元素。第一个参数是准备插入到其前面的那个元素的索引,例如a.insert(0,x)会插入到整个列表之前,而a.insert(len(a), x)相当于a.append(x)。
  4、list.remove(x):删除列表中值为 x 的第一个匹配元素。如果没有这样的元素,就会返回一个错误。
  5、list.pop([i]):从列表的指定位置移除元素,并将其返回。如果没有指定索引,a.pop()返回最后一个元素。元素随即从列表中被移除。(方法中i两边的方括号表示这个参数是可选的,而不是要求你输入一对方括号,你会经常在 Python 库参考手册中遇到这样的标记。)
  6、list.clear():移除列表中的所有项,等于del a[:]。
  7、list.index(x):返回列表中第一个值为 x 的元素的索引。如果没有匹配的元素就会返回一个错误。
  8、list.count(x):返回x在列表中出现的次数。
  9、list.sort():对列表中的元素进行排序(默认从小到大排序)。
  10、list.reverse():倒排列表中的元素。
  11、list.copy():返回列表的浅复制,等于a[:]。
备注:
  1、python浅复制和深复制的区别:对于可更改类型(复合型对象),复制有分浅复制和深复制两种类型。
    ①浅复制(list.copy()):意味着新建一个对象B,但是其子元素仍然指向对应原对象A的子对象(也就是说,A中原有的数据改变,B也会跟着改变)。同时,只会对原对象A这一层进行拷贝,而不会递归的对子对象也进行拷贝(类似A新增操作就不会对B起作用)。
    举个例子:  A = [[1,2],[2,3,4]]
          B = A.copy()
          print(B) #输出:[[1,2],[2,3,4]]
          C = [1,3,4]
          A.append(C)
          print(A) #输出:[[1,2],[2,3,4],[1,3,4]]
          print(B) #输出:[[1,2],[2,3,4]]
          A[0][0] = 'a'
          print(A) #输出:[['a',2],[2,3,4],[1,3,4]]
          print(B) #输出:[['a',2],[2,3,4],[1,3,4]]
  总结:也就是说,对对象A进行浅复制之后得到的B对象,对原本复制的内容,A更改则B跟着改,但是自浅复制完后,A对除原有数据外进行操作,例如增加列表元素,都不会对B造成影响。
    ②深复制:意味着新建一个对象B,但是其子元素不再指向对应原对象A的子对象,类似于克隆出来的完全独立体。(也就是说,A中原有的数据 改变,B不会跟着改变)。自然往A中的其他任何操作,都应该不会对B有任何影响的了。
    重用上面例子的数据举例:
      D = copy.deepcopy(A)
      print(D) #[[1,2],[2,3,4]]
      A[0][0] = 'a'
      print(A) #输出:[['a',2],[2,3,4],[1,3,4]]
      print(B) #输出:[['1',2],[2,3,4],[1,3,4]]数据不会跟着改变

  2、用append()和不指定索引的pop()方法可以实现列表充当堆栈的进出操作。


  3、列表推导式:每个列表推导式都在for之后跟一个表达式,然后又零到多个for/if语句,返回结果是一个根据表达从其后的for和if 上下文环境中生成出来的列表。如果希望表达式推导出一个元组,就必须使用括号。举个例子说明一下怎么用即可:
    >>> A = [1,2,3]
    >>> [10*i for i in A] #输出:[10,20,30]
    >>> [[i, i**2] for i in A] #输出:[[1, 1],[2, 4],[3,9]]

2)嵌套列表解析

这部分就讲一个矩阵行列倒置:
  eg:
    >>> A = [
        [1, 2, 3, 4],
        [5, 6, 7, 8],
        [9, 10, 11, 12],
      ]
    >>> [[row[i] for row in A] for i in range(4)] #进行行列倒置
    >>> print(A)#输出:[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

3)遍历技巧
  1、字典遍历时,关键字和对应的值可以使用items()方法同时解读出来:
    eg:>>> A = {'a': 'b', 'c': 'd'}
      >>> for i, j in A.items():
      >>> print(k, v)

  2、序列遍历时,索引位置和对应值可以使用enumerate()函数同时得到:
    eg:>>> for i, j in enumerate(['a', 'b', 'c']):
      >>> print(i, v)

  3、同时遍历两个或者更多的序列时,可以使用zip()组合:
    eg:>>> A = ['name', 'phone', 'school']
      >>> B = ['yangrongkuan','18813299877','scnu']
      >>> for i,j in zip(A, B):
      >>> print('What is your {0}? It is {1}.'.format(i, j))

  4、反向遍历一个序列:
    eg:>>> for i in reverse(range(1,10,2)):
      >>> print(i)

  5、要按顺序遍历一个序列,可以使用sorted()函数返回一个已排序的序列,并不修改原值:
    eg:>>> basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
      >>> for i in sorted(set(basket)):#不用指定按照什么顺序进行排序的
      >>> print(i)

原文地址:https://www.cnblogs.com/yangrongkuan/p/12076781.html