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基础、数据分析、大数据、推荐系统知识;