美文网首页程序员
python算法进阶(一)

python算法进阶(一)

作者: 肥宅_Sean | 来源:发表于2017-11-02 17:42 被阅读0次

欢迎扫描最后的二维码,进行关注!<快可以开评论了~>

这是在看cookbook的一些感想,目录很多都是跟原来的类似的。内容大多都是自己吸收完了之后,打的。


下面将围绕几个问题展开

目录

  • 解压序列赋值给多个变量
  • 保留最后的N个元素
  • 查找最大或者最小的N个元素
  • 实现一个优先级队列
  • 字典中的键映射多个值
  • 字典排序运算
  • 删除序列相同元素并保持顺序

解压序列赋值给多个变量

1.恰好匹配
代码:

data = ['ALice', 'f', 12, (100, 99, 80)]
# 上面为数据 名字 性别 年龄 语数英三科成绩
name, sex, age, score = data
print('name:', name)
print('sex:', sex)
print('age:', age)
print('score:', score)

输出结果:
name: ALice
sex: f
age: 12
score: (100, 99, 80)

可以看到,上面解压数据的代码部分,是完全匹配好的,就是左边的元素和列表的元素长度是相等的,下面展示不是完全匹配的情况。
2.不是完全匹配
代码:

data = ['ALice', 'f', 12, (100, 99, 80)]
# 上面为数据 名字 性别 年龄 语数英三科成绩
name, sex, *other = data
print('name:', name)
print('sex:', sex)
print('other:', other)

输出:
name: ALice
sex: f
other: [12, (100, 99, 80)]

上面方法也是可以把*other这个放到中间的

要是想实现取其中的部分数据的方法
3.部分数据不想要的
代码:

data = ['ALice', 'f', 12, (100, 99, 80)]
# 上面为数据 名字 性别 年龄 语数英三科成绩
_, sex, _, score = data
print('sex:', sex)
print('other:', score)

输出:
sex: f
other: (100, 99, 80)

保留最后的N个元素

下面代码实现了保留最后的3个匹配成功的字符串

from collections import deque

def search(lines, pattern, history=5):
    previous_lines = deque(maxlen=history)
    for li in lines:
        if pattern in li:
            previous_lines.append(li)
    return previous_lines


l = ['122,2', '123,21', 'python', '1,2,2,2', 'ass,s', 'python1', 'python2', 'python3']
for i in search(l, ',', 3):
    print(i)

查找最大或者最小的N个元素

这个跟前一个区别就在于最大最小的问题
heapq中的nlargest和nsmallest可以实现

import heapq
nums = [10, -2, 3, 31, 21, 9, 2, -199, 12, 5435]
print(heapq.nlargest(4, nums))
print(heapq.nsmallest(4, nums))

但要是只需要用第一个,就用max或者min
要是数目跟原来的整个序列的长度差不多,就可以直接用sort,然后再切片

实现一个优先级队列

代码如下:

import heapq
class PriorityQueue:
    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]

pq = PriorityQueue()
pq.push('a', 4)
pq.push('b', 5)
pq.push('c', 3)
print(pq.pop())
print(pq.pop())
print(pq.pop())

插入的时候,用的是元组的方式,并将元组的第一个放的是优先级的负数,所以就是从大到小的一个优先级,否则就是从小到大的一个优先级

字典中的键映射多个值
代码如下:

from collections import defaultdict
d = defaultdict(list)
d['a'].append(1)
d['a'].append(2)
print(d)

其中的append是list的方法
输出结果是:
defaultdict(<class 'list'>, {'a': [1, 2]})

还有一种方法是(可以去重)

from collections import defaultdict
d = defaultdict(set)
d['a'].add(1)
d['a'].add(1)
print(d)

输出结果是:
defaultdict(<class 'set'>, {'a': {1}})

字典排序运算
选最大

prices = {
    'AAAA': 12.22,
    'BBBB': 111.11,
    'CCCC': 555.5,
    'DDDD': 76
}
print(max(zip(prices.values(), prices.keys())))
print(max(zip(prices.keys(), prices.values())))

输出结果是:
(555.5, 'CCCC')
('DDDD', 76)

排序:

prices = {
    'AAAA': 12.22,
    'BBBB': 111.11,
    'CCCC': 555.5,
    'DDDD': 76
}
print(sorted(zip(prices.values(), prices.keys())))
print(sorted(zip(prices.keys(), prices.values())))

找到字典中相同键值部分

a = {
    'AAAA': 12.22,
    'BBBB': 111.11,
    'CCCC': 555.5,
    'DDDD': 76
}
b = {
    'AAAA': 12.3,
    'BBBB': 12
}
c = a.keys() & b.keys()
print(c)

删除序列相同元素并保持顺序
代码一:

def dedupe(items):
    seen = set()
    for item in items:
        if item not in seen:
            yield item
            seen.add(item)

a = [1,2,3,3,3,8,4,2]
print(list(dedupe(a)))

代码二:

a = [1,2,3,3,3,8,4,2]
def d(items):
    seen = set()
    for item in items:
        if item not in seen:
            seen.add(item)
    return seen
print(list(d(a)))

结果都是一样的


最后求一波关注

欢迎扫码关注

相关文章

网友评论

    本文标题:python算法进阶(一)

    本文链接:https://www.haomeiwen.com/subject/ffkapxtx.html