python技巧(1)

星号的作用

python利用*号对可迭代的对象进行解压,并赋值给多个对象。
示例代码如下:

1
2
3
4
record = ['lakers','76ers','warriors']	  
*teams,team = record
print(*teams)
out:lakers 76ers

星号表达式也可以应用于列表的开始部分以及字符串的分割,若想解压一些元素而不使用,则使用一个普通的’_’或’ign’即可。在迭代元素为可变长元组的序列时很有用。
示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
records = [
('no1','76ers'),
('no2','warriors'),
('no1','bull')]
def bar(s):
print('no1',s)
for tag,*args in records:
if tag == 'no1':
bar(*args)
out:no1 76ers
no1 bull

其中records为一个带有标签的元组序列

如何保留最后N个元素

示例代码如下:

1
2
3
4
5
6
7
from collections import deque
def search(lines,pattern,history = 5):
previous = deque(maxlen=history)
for line in lines:
if pattern in line:
yield line,previous
previous.append(line)

在多行上做简单的文本匹配,并返回匹配所在行的最后N行。使用deque(maxlen=N)构造函数会新建一个固定大小的队列。当新的元素加入并且这个队列已满,最老的元素会自动被移除掉。

dict创建字典

dict.fromkeys(“[…],[…]”) 第一个参数指定keys,第二个参数指定value

实现一个简单的优先级队列

示例代码如下:
Item类

1
2
3
4
5
6
7
8
class Item():
def __init__(self,name):
self.name=name
def __repr__(self):
return 'Item({})'.format(self.name)
q=Priority()
q.push(Item('foo'),1)
q.pop()
1
2
3
4
5
6
7
8
9
10
import heapq
class Priority():
def __init__(self):
self._queue=[]
self._index=0
def push(self,item,prior):
heapq.heappush(self._queue,(-prior,self._index,item))
self._index+=1
def pop(self):
return heapq.heappop(self._queue)[-1]

字典中的键映射多个值

d=defaultdict(list)
d=setdefault('a',[]).append(1)

去重

(return和yield的区别)
示例代码如下:

1
2
3
4
5
6
7
8
def deque(items):
a=set()
for item in items:
if item not in a:
#yield item
a.add(item)
return a
c=list(deque([1,4,6,7,2,56,2,1]))

若是不用return,用yield编写生成器。
示例代码如下:

1
2
3
4
5
6
7
8
9
def dedupe(items,key=None):
a=set()
for item in items:
var=item if key is None else key(item)
if var not in a:
yield item
a.add(var)
seed=[{'x':1,'y':2},{'x':3,'y':7},{'x':1,'y':2}]
d=list(dedupe(seed,key=lambda x:x['x']))

关于命名切片

  • 内置的slice()函数创建了一个切片对象,可以用在任何切片允许使用的地方。
  • indices(sizde)返回一个三元组(start,stop,step),所有值都会被合适的缩小以满足边界限制,避免出现indexError异常。for i in range(*a.indices(len(list)))

关键字排序

使用itertools.groupby函数,扫描整个序列,并且查找连续相同值的元素序列。在此之前,是要会根据分组的字段进行预先排序。
示例代码如下:
rows.sort(key=itemgetter('date'))
for date,item in groupby(rows,key=itemgetter('date')):

字典表达式

示例代码如下:
p={key:value for key,value in dict1.items() if key in list1}
p=dict((key,value) for key,value in dict1.items() if value>80)

命名元组

示例代码如下:

1
2
3
4
from collections import namedtuple
info=namedtuple('info',['name','age'])
sub=info('Tom',18)
sub.age

好处是避免使用下标操作让代码表意不清,且非常依赖代码的结构。
如果需要改变属性的值,使用命名元组实例的_replace()方法,它会创建一个全新的命名元组并将对应的字段用新的值来代替。
当命名元组拥有可选或缺失字段的情况下,可以利用命名元组来填充数据,先创建一个包含缺省值的原型元组,使用_replace()方法创建新的值。

0%