python进阶-内部数据结构和算法

2018-04-04  本文已影响0人  openex

本文内容整理自《Python Cookbook》,仅用作本人学习笔记,若侵犯原著权益请尽快联系本人。


1.将序列分解为单独变量

data = ('Kevin', 50, 100, (2017, 2, 28))
name, shares, _, date = data

# _ 变量理解为忽略该位置元素

2.从任意长度的可迭代对象中分离元素

record = ('Kevin', 50, 100, (2017, 2, 28))
name, *_,(*_,year) = record

# *args会贪婪的获取元祖成员

3.保存最后N个元素

from collections import deque
q = deque(maxlen=5)
q.append((1,2))
q.append(4)
q.appendleft(3)
print(q)
q.pop()
q.popleft()
print(q)
##print
# deque([3, (1, 2), 4], maxlen=5)
# deque([(1, 2)], maxlen=5)

4.找到最大或最小的N个元素

5.实现优先级队列

import heapq

class priorityList(object):
    def __init__(self):
        self._queue = []
        self._index = 0

    def push(self,item,priority):
        heapq.heappush(self._queue, (-priority, self._index, item))
        self._index += 1

    def pop(self):
        return heapq.heappop(self._queue)[-1]

if __name__ == '__main__':
    q = priorityList()
    q.push(5,2)
    q.push(3,1)
    q.push(7,1)
    print(q.pop())
    print(q._queue)

6.生成一对多字典

from collections import defaultdict

d = defaultdict(list)
for key, value in pairs:
    d[key].append(value)

7.让字典保持有序

from collections import OrderedDict
d = OrderedDict()
##然后当字典用

8.与字典有关的计算问题

min(zip(d.values(), d.keys()))
max(zip(d.values(), d.keys()))

9.两个字典的相同点

a = {'a':1,'b':2}
c = {key:a[key] for key in a.keys() - ('b')}
# 字典解析

10.序列去重并顺序不变

def depute(items, key=None):
    s = set()
    for item in items:
        val = item if key == None else key(item)
        if val not in s:
            yield item
            s.add(val)

c = [{'x':1,'y':2},{'x':1, 'y':3},{'x':2, 'y':3}]
print(list(depute(c, lambda d:(d['x']))))

11.对切片命名

PRICE = slice(2,4)
record = 'AA123456567899'
cost = int(record[PRICE]) * 2

12.找出序列中出现次数最多的元素

words = ['i','am','i']
word_counts = Counter(words)
print(word_counts.most_common(3))
word_counts['i'] += 1
morewords = ['i','was']
word_counts.update(morewords)

13.通过公共键堆字典列表排序

from operator import itemgetter
sorted(d, key=itemgetter('lname'))

14.对不原生支持比较的对象排序

15.根据字段将字典列表分组

from operator import itemgetter
from itertools import groupby

rows.sort(key=itemgetter('date'))
for date, items in groupby(rows, key=itemgetter('date')):
    for i in items:
        print(i)

16.筛选序列的元素

17.从字典中提取子集

18.将名称映射到序列的元素中

from collections import namedtuple

Subscribe = namedtuple('Subscribe',['addr', 'joined'])
sub = Subscribe('openex@qq.com','2016/1/1')
sub = sub._replace(joined=2) 
print(sub.addr)
print(sub.joined)

19.同时对数据做转换和换算

d= [{'name':'kevin', 'price':1},{'name':"openex", 'price':2}]
print(max(s['price'] * 2 for s in d))
###输出: 4
print(max(d, key=lambda s:s['price'] * -1) )
###输出: {'name': 'kevin', 'price': 1}

20.将多个字典映射为一个字典

上一篇 下一篇

猜你喜欢

热点阅读