Python有一些技巧对你来说是新知识,但是还有一些技巧会让你的代码效率大幅提升。
本文总结了一下自己用到的一些Python高级编程技巧,希望对大家有帮助。
列表生成器
a=[1,2,3] [x*x for x in a if x>1]
[4, 9]
集合生成器
a=[1,2,3] s = {x*x for x in a if x>1} s
{4, 9}
type(s)
set
字典生成器
a=[1,2,3] {str(x):x+1 for x in a if x>1}
{'2': 3, '3': 4}
range
list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
list(range(3,10))
[3, 4, 5, 6, 7, 8, 9]
filter用于过滤数据
list(filter(lambda x:x%3==0, range(10)))
[0, 3, 6, 9]
collections.namedtuple给列表或者元组命名
from collections import namedtuple Point = namedtuple('Point', ['x', 'y']) p = Point(11, 22)
p.x
11
p.y
22
random的使用
from random import randint randint(1,10)
1
统计序列元素的频度和TOP N
from collections import Counter c = Counter('aaabbbbccccccddddddeeeeee')
c
Counter({'a': 3, 'b': 4, 'c': 6, 'd': 6, 'e': 6})
c.most_common(3)
[('c', 6), ('d', 6), ('e', 6)]
将字典按value排序
from random import randint keys = 'abcdefg' d = {x:randint(90,100) for x in keys}
d
{'a': 90, 'b': 98, 'c': 100, 'd': 97, 'e': 95, 'f': 93, 'g': 92}
d.items()
dict_items([('a', 90), ('b', 98), ('c', 100), ('d', 97), ('e', 95), ('f', 93), ('g', 92)])
sorted(d.items(), key=lambda x : x[1])
[('a', 90), ('g', 92), ('f', 93), ('e', 95), ('d', 97), ('b', 98), ('c', 100)]
获得多个词典的key的交集
from random import randint, sample dd1 = {x:randint(90,100) for x in sample('abcdefghij', 5)} dd2 = {x:randint(90,100) for x in sample('abcdefghij', 5)} dd3 = {x:randint(90,100) for x in sample('abcdefghij', 5)}
dd1
{'h': 99, 'f': 94, 'c': 91, 'i': 99, 'b': 95}
dd2
{'b': 95, 'g': 91, 'h': 98, 'f': 100, 'd': 92}
dd3
{'h': 95, 'g': 99, 'a': 100, 'd': 96, 'i': 92}
mp = map(dict.keys, (dd1, dd2, dd3))
list(mp)
[dict_keys(['h', 'f', 'c', 'i', 'b']), dict_keys(['b', 'g', 'h', 'f', 'd']), dict_keys(['h', 'g', 'a', 'd', 'i'])]
from functools import reduce reduce(lambda x,y: x&y, mp)
{'h'}
怎样让字典按照插入有序
from collections import OrderedDict d = OrderedDict() d['x'] = 1 d['y'] = 2 d['a'] = 2 d['b'] = 2 d
OrderedDict([('x', 1), ('y', 2), ('a', 2), ('b', 2)])
怎样实现长度为N的队列功能
from collections import deque d = deque([], 3) d.append(1) d.append(2) d.append(3) d.append(4) d
deque([2, 3, 4])
怎样同时遍历多个集合
names = [x for x in 'abcdefg'] ages = [x for x in range(21, 28)] scores = [randint(90,100) for x in range(7)]
for name,age,score in zip(names, ages, scores): print(name,age,score)
a 21 95 b 22 99 c 23 94 d 24 95 e 25 100 f 26 96 g 27 95
怎样串行的遍历多个集合
lista = (randint(1,10) for x in range(10)) listb = [randint(90,100) for x in range(20)]
from itertools import chain
for x in chain(lista, listb): print(x, end=',')
5,10,3,1,8,7,6,5,6,8,92,95,91,98,95,93,96,95,94,98,92,90,91,91,99,96,90,100,94,99,
使用多种分隔符替换字符串
s = 'a,b;c/d' import re re.sub(r'[,;/]', '-', s)
'a-b-c-d'
字符串的模糊搜索与部分替换
s = 'things happend in 2017-08-09, it is a sunddy' re.sub(r'(\d{4})-(\d{2})-(\d{2})', r'\2-\1-\3', s)
'things happend in 08-2017-09, it is a sunddy'
列表JOIN时如果有数字元素怎么办
print('\t'.join([str(x) for x in ['a','b',33,4.0,'e']]))
a b 33 4.0 e
如何使用多线程-方法1
from threading import Thread def func(x): print(x, x*x*x) ts = [] for x in range(10): t = Thread(target=func, args=(x,)) t.start() ts.append(t) for t in ts: t.join() print('main thread over')
0 0 1 1 2 8 3 27 4 64 5 125 6 216 7 343 8 512 9 729 main thread over
如何使用多线程-方法2
以下的输出错乱,是正常的,因为多个线程同时print就错乱了
from threading import Thread class MyThread(Thread): def __init__(self, x): Thread.__init__(self) self.x = x def run(self): print(self.x, self.x*self.x*self.x) ts = [] for x in range(10): t = MyThread(x) t.start() ts.append(t) for t in ts: t.join() print('main thread over')
0 0 1 1 2 3 27 8 45 64 6 216 125 7 343 8 512 9 729 main thread over
关注我,学习更多Python基础、数据分析、大数据、推荐系统知识;