zoukankan      html  css  js  c++  java
  • 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)

  • 相关阅读:
    顺序栈用C语言实现
    对队列的操作和算法
    对链表的操作与算法
    对动态数组的操作与算法
    链表
    冒泡排序
    指针之动态分配内存
    字符串匹配KMP算法
    DS二叉树--层次遍历
    DS图--最小生成树
  • 原文地址:https://www.cnblogs.com/yangrongkuan/p/12076781.html
Copyright © 2011-2022 走看看