40个你可能不知道的Python技巧附代码
|
1、拆箱 >>> a,b,c = 1,2,3 >>> a,c (1,3) >>> a,c = [1,3] >>> a,c = (2 * i + 1 for i in range(3)) >>> a,3,5) >>> a,(b,c),d = [1,(2,3),4] >>> a 1 >>> b 2 >>> c 3 >>> d 4 2、使用拆箱进行变量交换 >>> a,b = 1,2 >>> a,b = b,a >>> a,b (2,1) 3、扩展的拆箱(Python 3支持) >>> a,*b,4,5] >>> a 1 >>> b [2,4] >>> c 5 4、负数索引 >>> a = [0,1,5,6,7,8,9,10] >>> a[-1] 10 >>> a[-3] 8 5、列表切片(a[start:end]) >>> a = [0,10] >>> a[2:8] [2,7] 6、负数索引的列表切片 >>> a = [0,10] >>> a[-4:-2] [7,8] 7、带步数的列表切片(a[start:end:step]) >>> a = [0,10] >>> a[::2] [0,10] >>> a[::3] [0,9] >>> a[2:8:2] [2,6] 8、负数步数的列表切片 >>> a = [0,10] >>> a[::-1] [10,0] >>> a[::-2] [10,0] 9、列表切片赋值 >>> a = [1,5] >>> a[2:3] = [0,0] >>> a [1,5] >>> a[1:1] = [8,9] >>> a [1,5] >>> a[1:-1] = [] >>> a [1,5] 10、切片命名(slice(start,end,step)) >>> a = [0,5] >>> LASTTHREE = slice(-3,None) >>> LASTTHREE slice(-3,None,None) >>> a[LASTTHREE] [3,5] 11、遍历列表索引和值(enumerate)
>>> a = ["Hello","world","!"]
>>> for i,x in enumerate(a):
... print "{}: {}".format(i,x)
...
0: Hello
1: world
2: !
12、遍历字典的KEY和VALUE(dict.iteritems)
>>> m = {"a": 1,"b": 2,"c": 3,"d": 4}
>>> for k,v in m.iteritems():
... print "{}: {}".format(k,v)
...
a: 1
c: 3
b: 2
d: 4
# 注意:Python 3中要使用dict.items
13、压缩 & 解压列表和可遍历对象
>>> a = [1,3]
>>> b = ["a","b","c"]
>>> z = zip(a,b)
>>> z
[(1,"a"),"b"),(3,"c")]
>>> zip(*z)
[(1,("a","c")]
14、使用zip分组相邻列表项 >>> a = [1,6] >>> # Using iterators >>> group_adjacent = lambda a,k: zip(*([iter(a)] * k)) >>> group_adjacent(a,3) [(1,(4,6)] >>> group_adjacent(a,2) [(1,2),4),(5,1) [(1,),(6,)] >>> # Using slices >>> from itertools import islice >>> group_adjacent = lambda a,k: zip(*(islice(a,i,k) for i in range(k))) >>> group_adjacent(a,)] 15、使用zip & iterators实现推拉窗(n-grams) >>> from itertools import islice >>> def n_grams(a,n): ... z = (islice(a,None) for i in range(n)) ... return zip(*z) ... >>> a = [1,6] >>> n_grams(a,5),6)] >>> n_grams(a,4) [(1,6)] 16、使用zip反相字典对象
>>> m = {"a": 1,"d": 4}
>>> m.items()
[("a",1),("c",("b",("d",4)]
>>> zip(m.values(),m.keys())
[(1,"c"),"d")]
>>> mi = dict(zip(m.values(),m.keys()))
>>> mi
{1: "a",2: "b",3: "c",4: "d"}
17、合并列表 >>> a = [[1,2],[3,4],[5,6]] >>> list(itertools.chain.from_iterable(a)) [1,6] >>> sum(a,[]) [1,6] >>> [x for l in a for x in l] [1,6] >>> a = [[[1,4]],[[5,6],[7,8]]] >>> [x for l1 in a for l2 in l1 for x in l2] [1,8] >>> a = [1,8]]] >>> flatten = lambda x: [y for l in x for y in flatten(l)] if type(x) is list else [x] >>> flatten(a) [1,8] Note: according to Python"s documentation on sum,itertools.chain.from_iterable is the preferred method for this. 18、生成器 >>> g = (x ** 2 for x in xrange(10)) >>> next(g) 0 >>> next(g) 1 >>> next(g) 4 >>> next(g) 9 >>> sum(x ** 3 for x in xrange(10)) 2025 >>> sum(x ** 3 for x in xrange(10) if x % 3 == 1) 408 19、字典解析
>>> m = {x: x ** 2 for x in range(5)}
>>> m
{0: 0,1: 1,2: 4,3: 9,4: 16}
>>> m = {x: "A" + str(x) for x in range(10)}
>>> m
{0: "A0",1: "A1",2: "A2",3: "A3",4: "A4",5: "A5",6: "A6",7: "A7",8: "A8",9: "A9"}
20、使用字典解析反相字典对象
>>> m = {"a": 1,"d": 4}
>>> m
{"d": 4,"a": 1,"c": 3}
>>> {v: k for k,v in m.items()}
{1: "a",4: "d"}
21、命名的tuples(collections.namedtuple)
>>> Point = collections.namedtuple("Point",["x","y"])
>>> p = Point(x=4.0,y=2.0)
>>> p
Point(x=4.0,y=2.0)
>>> p.x
4.0
>>> p.y
2.0
22、继承命名tuples
>>> class Point(collections.namedtuple("PointBase","y"])):
... __slots__ = ()
... def __add__(self,other):
... return Point(x=self.x + other.x,y=self.y + other.y)
...
>>> p = Point(x=4.0,y=2.0)
>>> q = Point(x=2.0,y=3.0)
>>> p + q
Point(x=6.0,y=5.0)
23、Set & Set运算
>>> A = {1,3}
>>> A
set([1,3])
>>> B = {3,7}
>>> B
set([3,7])
>>> A | B
set([1,7])
>>> A & B
set([3])
>>> A - B
set([1,2])
>>> B - A
set([4,7])
>>> A ^ B
set([1,7])
>>> (A ^ B) == ((A - B) | (B - A))
True
24、Multisets运算(collections.Counter)
>>> A = collections.Counter([1,2])
>>> B = collections.Counter([2,3])
>>> A
Counter({2: 2,1: 1})
>>> B
Counter({2: 2,3: 1})
>>> A | B
Counter({2: 2,3: 1})
>>> A & B
Counter({2: 2})
>>> A + B
Counter({2: 4,3: 1})
>>> A - B
Counter({1: 1})
>>> B - A
Counter({3: 1})
25、列表中出现最多的元素(collections.Counter)
>>> A = collections.Counter([1,7])
>>> A
Counter({3: 4,1: 2,2: 2,4: 1,5: 1,6: 1,7: 1})
>>> A.most_common(1)
[(3,4)]
>>> A.most_common(3)
[(3,(1,2)]
26、双向队列(collections.deque) >>> Q = collections.deque() >>> Q.append(1) >>> Q.appendleft(2) >>> Q.extend([3,4]) >>> Q.extendleft([5,6]) >>> Q deque([6,4]) >>> Q.pop() 4 >>> Q.popleft() 6 >>> Q deque([5,3]) >>> Q.rotate(3) >>> Q deque([2,5]) >>> Q.rotate(-3) >>> Q deque([5,3]) 27、限制长度的双向队列(collections.deque) >>> last_three = collections.deque(maxlen=3) >>> for i in xrange(10): ... last_three.append(i) ... print ",".join(str(x) for x in last_three) ... 0 0,1 0,2 1,3 2,4 3,5 4,6 5,7 6,8 7,9 28、排序字典(collections.OrderedDict) >>> m = dict((str(x),x) for x in range(10)) >>> print ",".join(m.keys()) 1,8 >>> m = collections.OrderedDict((str(x),".join(m.keys()) 0,9 >>> m = collections.OrderedDict((str(x),x) for x in range(10,-1)) >>> print ",".join(m.keys()) 10,1 29、默认字典(collections.defaultdict) >>> m = dict() >>> m["a"] Traceback (most recent call last): File "<stdin>",line 1,in <module> KeyError: "a" >>> >>> m = collections.defaultdict(int) >>> m["a"] 0 >>> m["b"] 0 >>> m = collections.defaultdict(str) >>> m["a"] "" >>> m["b"] += "a" >>> m["b"] "a" >>> m = collections.defaultdict(lambda: "[default value]") >>> m["a"] "[default value]" >>> m["b"] "[default value]" 30、使用defaultdict代表tree
>>> import json
>>> tree = lambda: collections.defaultdict(tree)
>>> root = tree()
>>> root["menu"]["id"] = "file"
>>> root["menu"]["value"] = "File"
>>> root["menu"]["menuitems"]["new"]["value"] = "New"
>>> root["menu"]["menuitems"]["new"]["onclick"] = "new();"
>>> root["menu"]["menuitems"]["open"]["value"] = "Open"
>>> root["menu"]["menuitems"]["open"]["onclick"] = "open();"
>>> root["menu"]["menuitems"]["close"]["value"] = "Close"
>>> root["menu"]["menuitems"]["close"]["onclick"] = "close();"
>>> print json.dumps(root,sort_keys=True,indent=4,separators=(",",": "))
{
"menu": {
"id": "file","menuitems": {
"close": {
"onclick": "close();","value": "Close"
},"new": {
"onclick": "new();","value": "New"
},"open": {
"onclick": "open();","value": "Open"
}
},"value": "File"
}
}
# 查看更多:https://gist.github.com/hrldcpr/2012250
(编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
