1 列表字典集合过滤数据
列表
方法一:列表解析法
方法二:filter函数
注意在python3中,将返回一个迭代器,next可以消耗迭代器元素。
字典
集合
2 如何为元组命名,提高程序可读性
由于元组要比字典节省空间很多,因此固定格式的文件通常用元组保存,但访问时,我们只能使用索引方式访问,大量索引降低了程序的可读性。为了可读性,需要进行转换。推荐方法二
方法一:定义数值常量或枚举类型
方法二:使用collections.namedtuple替代内置的tuple
注意这里s2看起来像是类的对象,实际是元组,但是可以像访问对象一样访问其对应名称的值。
3 如何根据字典值得大小,对字典中得项进行排序
推荐方案2
例如:{“Liming”93,”lisiji”:22,”wangfei”:73},根据后面数字进行排名。
造数据:
from random import randint
d = {k: randint(50,100) for k in 'abcdefg'}
方案1:将字典中得项转化为(值,键)元组,(列表解析或zip)
l = [(v,k) for k,v in d.items()] # 和这个等价 list(zip(d.values(), d.keys()))
l # [(96, 'a'), (81, 'b'), (55, 'c'), (78, 'd'), (79, 'e'), (73, 'f'), (70, 'g')]
sorted(l, reverse=True) # [(96, 'a'), (81, 'b'), (79, 'e'), (78, 'd'), (73, 'f'), (70, 'g'), (55, 'c')]
方案2:传递sorted函数的key参数
sorted(d.items(), key=lambda item:item[1],reverse=True) #[('a', 96), ('b', 81), ('e', 79), ('d', 78), ('f', 73), ('g', 70), ('c', 55)]
加排序,注意不同的方式表达
list(enumerate(p, 1))
#[(1, ('a', 96)),
# (2, ('b', 81)),
# (3, ('e', 79)),
# (4, ('d', 78)),
# (5, ('f', 73)),
# (6, ('g', 70)),
# (7, ('c', 55))]
{k:(i,v) for i,(k,v) in enumerate(p, 1)}
#{'a': (1, 96),
# 'b': (2, 81),
# 'e': (3, 79),
# 'd': (4, 78),
# 'f': (5, 73),
# 'g': (6, 70),
# 'c': (7, 55)}
4 如何统计序列中元素的频度
任务:例如统计出现次数最高的,比如统计英文单词数量。
建议使用下面的方案2
方案1:将序列转换为字典{元素:频度},根据值排序
data = [randint(0,20) for _ in range(40)]
d = dict.fromkeys(data, 0) # 根据所有值,得到对应的key
# {19: 0,
# 4: 0,
# 5: 0,
# 3: 0,
# 6: 0,
# 0: 0,
# 15: 0,
# 8: 0,
# 2: 0,
# 18: 0,
# 1: 0,
# 9: 0,
# 12: 0,
# 7: 0,
# 20: 0,
# 17: 0,
# 10: 0}
for x in data:
d[x] +=1
sorted(((v,k) for k,v in d.items()),reverse=True)[:3] # [(5, 6), (4, 15), (4, 3)] 这里内部使用元组,比list节省空间
import heapq
# 也有heapq.nsmallest 函数可以使用
heapq.nlargest(3,((v,k) for k,v in d.items())) # [(6, 5), (3, 4), (15, 4)]
方案2:使用标准库collections中的Counter对象
data = [randint(0,20) for _ in range(40)]
from collections import Counter
c = Counter(data)
c.most_common(3) # [(6, 5), (3, 4), (15, 4)]
5 pickle 存取数据
from collections import deque
q = deque([],4)
q.append(3)
q.append(32)
q.append(1)
q #deque([3, 32, 1])
import pickle
pickle.dump(q, open('save.pkl', 'wb')) # pickle必须以二进制
q2 = pickle.load(open('save.pkl','rb'))
q2 #deque([3, 32, 1])