欢迎扫描最后的二维码,进行关注!<快可以开评论了~>
这是在看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)))
结果都是一样的
最后求一波关注
网友评论