python技巧

  • 排序

用lst.sort() 而不是nlst = sorted(lst)

区别在于lst.sort()是 in-place sort,改变lst, sorted会创建新list,成本比较高。

  • 用xrange

xrangge 和 range的区别是在于 range会产生list存在memory中,xrange更像是生成器,generate on demand

所以有的时候xrange会更快

  • 三目运算符

python 的三目运算符是这么写的 x if y else z

考虑这种list of list: matrix = [ [1,2,3] , [4,5,6] ]

row = len(matrix)

col = len(matrix[0]) if row else 0

这样写通用的原因是, 当matrix = [], row = 0, col =0

  • list 填 0

lst = [0 for i in range(3)] # lst = [0,0,0]

lst = [[0 for i in range(3)] for j in range(2)] # lst = [[0, 0, 0], [0, 0, 0]]

下面这种写法危险:

lst1 = [ 0, 0, 0 ]

lst2 = [lst1] * 2 # lst2 = [ [0,0,0] , [0,0,0] ]

lst2[0][0] = 1 # lst2 = [ [1,0,0], [1,0,0]]

因为lst1是object,这样写会踩坑

  • D.get(key, default)

如果这个key 没有在dict里面,给它一个默认值:

D = {}

if 1 in D:

val = D[1]

else :

val = 0

等同于这样写:

val = D.get(1, 0)

  • reverse list

lst = [1,2,3]

print lst[::-1] #[3,2,1]

lst 也有reverse函数

这也也适用于str, str可是没有reverse 函数的,str[::-1] 可用 √

=================进阶一下=====================

Python 也是有自己的数据结构的!!!!

  • deque

    还在用list来做queue么? deque,当求快queue的时候,你值得拥有

  • Counter

    Counter做啥就顾名思义了

  • yield

    用yield不用return ( 我也还在学习阶段

import collections就可以用了,参见

collections — High-performance container datatypes

===============举个当时我就震惊了的例子===============

看到在stackoverflow上看到有人求这样一个数据结构:

Anyone know this Python data structure?

  • Close to

    O(1) performance

    for as many of the following four operations.

  • Maintaining

    sorted order while inserting

    an object into the container.

  • Ability to

    peek at last value

    (the largest value) contained in the object.

  • Allowing for

    pops on both sides

    (getting the smallest or largest values).

  • Capability of

    getting the total size

    or number of objects being stored.

  • Being a

    ready made solution

    like the code in Python's standard library.

然后真的可以implement出来

  1. import collections

  2. import bisect

    1. class FastTable:

    1. def __init__(self):

  3. self.__deque = collections.deque()

    1. def __len__(self):

  4. return len(self.__deque)

    1. def head(self):

  5. return self.__deque.popleft()

    1. def tail(self):

  6. return self.__deque.pop()

    1. def peek(self):

  7. return self.__deque[-1]

    1. def insert(self, obj):

  8. index = bisect.bisect_left(self.__deque, obj)

  9. self.__deque.rotate(-index)

  10. self.__deque.appendleft(obj)

  11. self.__deque.rotate(index)

复制代码

对此我只想表示牛,并且我硬生生的用它来解过人家不是要这种思路的题目。

有想到的再补充,也欢迎任何技巧分享

补充内容 (2016-10-28 00:40):

Python有built-inheap,是min heap. heapq,如何来用它实现max heap呢,看到过一个有意思的方法是把key取负,比如把100变成-100,5变成-5。

Last updated

Was this helpful?