0x00:创建一键多值字典
字典是Python中的一种可变容器,通常以这种形式出现:
d = {key1:value1, key2:value2, key3:value3}
Python没有规定字典中值的类型,所以如果想让字典中的一个键对应多个值,只要把这些值放到列表这样的容器里就行了 。
Python资源共享群:484031800
student = { 'a': [76, 54, 82], 'b': [92, 67, 88]}为了方便创建这样的字典,可以使用 collections 模块中的 defaultdict 类 。一般在访问一个字典中不存在的key时会报错,defaultdict类则会自动初始化一个默认值 。使用defaultdict可以这样创建一个值为列表的字典:
d = defaultdict(list)d['a'].Append(1)d['a'].append(2)d['a'].append(3)0x01:有序字典
Python中字典的key是不记录顺序的,如果我们想在对字典进行迭代或者序列化操作时掌握元素的顺序,可以使用 collections 模块中的 OrderedDict 类 。
>>> from collections import OrderedDict>>> d = OrderedDict()>>> d['a'] = 1>>> d['b'] = 2>>> d['c'] = 3>>> for key in d:... print(key, d[key])... a 1b 2c 3OrderedDict内部维护了一个双向链表,每当字典中创建新元素,就会被放到链表的末尾 。对已存在的键重新赋值不会改变键的顺序 。由于OrderedDict创建了额外的链表,所以占用空间会比普通的字典要多 。使用这个类要注意取舍 。
0x02:对序列去重但保持顺序不变
要想去除一个列表中的重复项,只需要使用 set() 就可以了,set创建一个无重复项的集合,可以对其求交集、并集等操作 。但是,这种集合对象是无序的 。
>>> a = [1, 4, 6, 1, 2, 1, 3, 6, 2]>>> b = set(a)>>> b{1, 2, 3, 4, 6}如果你既想要去除重复项,又想保留顺序,可以通过 set() 加生成器的方式解决:
def dedupe(items): seen = set() for item in items: if item in items: if item not in seen: yield item seen.add(item)这只有当序列中的元素是不可变对象时起作用,例如整数、字符串、元组 。如果要应用在列表这类可变容器上,要对代码稍作修改:
def dedupe(items): seen = set() for item in items: val = item if key is None else key(item) if val not in seen: yield item seen.add(val)这里使用key参数来指定一个函数将序列中元素转变为不可变类型 。
0x03:统计元素的数量
如何找出一本书中出现频率最高的单词呢?或者想知道一个列表中相同元素出现的次数应该怎么做?使用 collections 模块中的 Counter 类可以轻松做到 。
>>> from collections import Counter>>> words = ['apple', 'keys', 'double', 'dude', 'eye', 'love', 'magic', 'double', 'magic', 'spell', 'apple', 'point', 'apple']>>> count = Counter(words)>>> countCounter({'apple': 3, 'double': 2, 'magic': 2, 'keys': 1, 'dude': 1, 'eye': 1, 'love': 1, 'spell': 1, 'point': 1})还可以使用Counter类的 most_common 方法来求排名前几的元素:
>>> top = count.most_common(3)>>> print(top)[('apple', 3), ('double', 2), ('magic', 2)]>>>另外,Counter对象还可以做数学运算:
>>> words = ['apple', 'keys', 'double', 'dude', 'eye', 'love', 'magic', 'double', 'magic', 'spell', 'apple', 'point', 'apple']>>> other = ['apple', 'cool', 'duck', 'cookie']>>> a = Counter(words)>>> b = Counter(other)>>> aCounter({'apple': 3, 'double': 2, 'magic': 2, 'keys': 1, 'dude': 1, 'eye': 1, 'love': 1, 'spell': 1, 'point': 1})>>> bCounter({'apple': 1, 'cool': 1, 'duck': 1, 'cookie': 1})>>> a + bCounter({'apple': 4, 'double': 2, 'magic': 2, 'keys': 1, 'dude': 1, 'eye': 1, 'love': 1, 'spell': 1, 'point': 1, 'cool': 1, 'duck': 1, 'cookie': 1})>>>Counter 类能够帮助我们很好地对数据做统计,当然,如果你是在做算法题,请不要使用它来取巧 。
0x04:字典推导式
想要创建一个字典的子集,可以用字典推导式(dictionary comprehension)轻松搞定 。没错,列表有列表生成式,字典也有字典推导式 。
>>> students = {'a':98, 'b':45, 'c':73, 'd':59}>>> passed = {key:value for key, value in students.items() if value >= 60}>>> passed{'a': 98, 'c': 73}>>>
推荐阅读
- 8个职场人必装的电脑软件,用过以后就离不开了,超级高效好用!
- 知识整理:如何高效整理读书笔记和文章?
- 如何利用TikTok给海外私域流量池引流
- python 文本处理
- 用Python抢火车票的简单小程序
- 机器学习10种经典算法的Python实现
- 用Python构建深度学习应用
- JS数组去重的几种方式
- Java如何利用Socket请求Http接口?
- python中的列表与元组