引言
Python为我们提供了4种基本的数据结构:list, tuple, dict, set,但是在处理数据量较大的情形的时候,这4种数据结构就明显过于单一了,比如list作为单向链表在某些情形插入的效率会比较低,有时候我们也需要维护一个有序的dict。所以这个时候我们就要用到Python标准库为我们提供的collections包了,它提供了多个有用的集合类,熟练掌握这些集合类,不仅可以让我们让写出的代码更加Pythonic,也可以提高我们程序的运行效率。
defaultdict的使用
defaultdict(default_factory)在普通的dict(字典)之上添加了default_factory,使得key(键)不存在时会自动生成相应类型的value(值),default_factory参数可以指定成list, set, int等各种合法类型。
example1
>>> from collections import defaultdict >>> s = [('red', 1), ('blue', 2), ('red', 3), ('blue', 4), ('red', 1), ('blue', 4)]
我们现在有上面这样一组list(列表),虽然我们有6组数据,但是仔细观察后发现其实我们只有两种color(颜色),但是每一个color对应多个值。现在我们想要将这个list转换成一个dict(字典),这个dict的key(键)对应一种color,dict的value(值)设置为一个list存放color对应的多个值。我们可以使用defaultdict(list)来解决这个问题。
# d可以看作一个dict(字典),dict的value是一个list(列表) >>> d = defaultdict(list) >>> for k, v in s: ... d[k].append(v) ... >>> d defaultdict(<class 'list'>, {'blue': [2, 4, 4], 'red': [1, 3, 1]})
example2
上面这个例子中有一些不完美的地方,比如说{‘blue’: [2, 4, 4], ‘red’: [1, 3, 1]}这个defaultdict中blue颜色中包含两个4,red颜色中包含两个1,但是我们不希望含有重复的元素,这个时候可以考虑使用defaultdict(set)来解决这个问题。set(集合)相比list(列表)的不同之处在于set中不允许存在相同的元素。
>>> d = defaultdict(set) >>> for k, v in s: ... d[k].add(v) ... >>> d defaultdict(<class 'set'>, {'blue': {2, 4}, 'red': {1, 3}})
example3
>>> s = 'hello world'
通过使用defaultdict(int)的形式我们来统计一个字符串中每个字符出现的个数。
>>> d = defaultdict(int) >>> for k in s: ... d[k] += 1 ... >>> d defaultdict(<class 'int'>, {'o': 2, 'h': 1, 'w': 1, 'l': 3, ' ': 1, 'd': 1, 'e': 1, 'r': 1})
OrderedDict的使用
我们知道默认的dict(字典)是无序的,但是在某些情形我们需要保持dict的有序性,这个时候可以使用OrderedDict,它是dict的一个subclass(子类),但是在dict的基础上保持了dict的有序型,下面我们来看一下使用方法。
example1
>>> from collections import OrderedDict # 无序的dict >>> d = {'banana': 3, 'apple': 4, 'pear': 1, 'orange': 2}
这是一个无序的dict(字典),现在我们可以使用OrderedDict来让这个dict变得有序。
# 将d按照key来排序 >>> OrderedDict(sorted(d.items(), key=lambda t: t[0])) OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)]) # 将d按照value来排序 >>> OrderedDict(sorted(d.items(), key=lambda t: t[1])) OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)]) # 将d按照key的长度来排序 >>> OrderedDict(sorted(d.items(), key=lambda t: len(t[0]))) OrderedDict([('pear', 1), ('apple', 4), ('orange', 2), ('banana', 3)])
example2
使用popitem(last=True)方法可以让我们按照LIFO(先进后出)的顺序删除dict中的key-value,即删除最后一个插入的键值对,如果last=False就按照FIFO(先进先出)删除dict中key-value。
>>> d = {'banana': 3, 'apple': 4, 'pear': 1, 'orange': 2} # 将d按照key来排序 >>> d = OrderedDict(sorted(d.items(), key=lambda t: t[0])) >>> d OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)]) # 使用popitem()方法来移除最后一个key-value对 >>> d.popitem() ('pear', 1) # 使用popitem(last=False)来移除第一个key-value对 >>> d.popitem(last=False) ('apple', 4)
example3
使用move_to_end(key, last=True)来改变有序的OrderedDict对象的key-value顺序,通过这个方法我们可以将排序好的OrderedDict对象中的任意一个key-value插入到字典的开头或者结尾。
>>> d = OrderedDict.fromkeys('abcde') >>> d OrderedDict([('a', None), ('b', None), ('c', None), ('d', None), ('e', None)]) # 将key为b的key-value对移动到dict的最后 >>> d.move_to_end('b') >>> d OrderedDict([('a', None), ('c', None), ('d', None), ('e', None), ('b', None)]) >>> ''.join(d.keys()) 'acdeb' # 将key为b的key-value对移动到dict的最前面 >>> d.move_to_end('b', last=False) >>> ''.join(d.keys()) 'bacde'
deque的使用
list存储数据的优势在于按找索引查找元素会很快,但是插入和删除元素就很慢了,因为它是是单链表的数据结构。deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈,而且线程安全。
list只提供了append和pop方法来从list的尾部插入/删除元素,但是deque新增了appendleft/popleft允许我们高效的在元素的开头来插入/删除元素。而且使用deque在队列两端添加(append)或弹出(pop)元素的算法复杂度大约是O(1),但是对于list对象改变列表长度和数据位置的操作例如 pop(0)和insert(0, v)操作的复杂度高达O(n)。由于对deque的操作和list基本一致,这里就不重复了。
ChainMap的使用
ChainMap用来将多个dict(字典)组成一个list(只是比喻),可以理解成合并多个字典,但和update不同,而且效率更高。
>>> from collections import ChainMap >>> a = {'a': 'A', 'c': 'C'} >>> b = {'b': 'B', 'c': 'D'} >>> m = ChainMap(a, b) # 构造一个ChainMap对象 >>> m ChainMap({'a': 'A', 'c': 'C'}, {'b': 'B', 'c': 'D'}) >>> m['a'] 'A' >>> m['b'] 'B' # 将m变成一个list >>> m.maps [{'a': 'A', 'c': 'C'}, {'b': 'B', 'c': 'D'}] # 更新a中的值也会对ChainMap对象造成影响 >>> a['c'] = 'E' >>> m['c'] 'E' # 从m复制一个ChainMap对象,更新这个复制的对象并不会对m造成影响 >>> m2 = m.new_child() >>> m2['c'] = 'f' >>> m['c'] 'E' >>> a['c'] 'E' >>> m2.parents ChainMap({'a': 'A', 'c': 'C'}, {'b': 'B', 'c': 'D'})
Counter的使用
example1
Counter也是dict的一个subclass,它是一个无序容器,可以看做一个计数器,用来统计相关元素出现的个数。
>>> from collections import Counter >>> cnt = Counter() # 统计列表中元素出现的个数 >>> for word in ['red', 'blue', 'red', 'green', 'blue', 'blue']: ... cnt[word] += 1 ... >>> cnt Counter({'blue': 3, 'red': 2, 'green': 1}) # 统计字符串中元素出现的个数 >>> cnt = Counter() >>> for ch in 'hello': ... cnt[ch] = cnt[ch] + 1 ... >>> cnt Counter({'l': 2, 'o': 1, 'h': 1, 'e': 1})
example2
使用elements()方法按照元素的出现次数返回一个iterator(迭代器),元素以任意的顺序返回,如果元素的计数小于1,将忽略它。
>>> c = Counter(a=4, b=2, c=0, d=-2) >>> c Counter({'a': 4, 'b': 2, 'c': 0, 'd': -2}) >>> c.elements() <itertools.chain object at 0x7fb0a069ccf8> >>> next(c) 'a' # 排序 >>> sorted(c.elements()) ['a', 'a', 'a', 'a', 'b', 'b']
使用most_common(n)返回一个list, list中包含Counter对象中出现最多前n个元素。
>>> c = Counter('abracadabra') >>> c Counter({'a': 5, 'b': 2, 'r': 2, 'd': 1, 'c': 1}) >>> c.most_common(3) [('a', 5), ('b', 2), ('r', 2)]
namedtuple的使用
使用namedtuple(typename, field_names)命名tuple中的元素来使程序更具可读性。
>>> from collections import namedtuple >>> Point = namedtuple('PointExtension', ['x', 'y']) >>> p = Point(1, 2) >>> p.__class__.__name__ 'PointExtension' >>> p.x 1 >>> p.y 2
以上就是Python 标准库之 collections 使用教程 的内容,更多相关内容请关注PHP中文网(www.php.cn)!

Python和C 各有优势,选择应基于项目需求。1)Python适合快速开发和数据处理,因其简洁语法和动态类型。2)C 适用于高性能和系统编程,因其静态类型和手动内存管理。

选择Python还是C 取决于项目需求:1)如果需要快速开发、数据处理和原型设计,选择Python;2)如果需要高性能、低延迟和接近硬件的控制,选择C 。

通过每天投入2小时的Python学习,可以有效提升编程技能。1.学习新知识:阅读文档或观看教程。2.实践:编写代码和完成练习。3.复习:巩固所学内容。4.项目实践:应用所学于实际项目中。这样的结构化学习计划能帮助你系统掌握Python并实现职业目标。

在两小时内高效学习Python的方法包括:1.回顾基础知识,确保熟悉Python的安装和基本语法;2.理解Python的核心概念,如变量、列表、函数等;3.通过使用示例掌握基本和高级用法;4.学习常见错误与调试技巧;5.应用性能优化与最佳实践,如使用列表推导式和遵循PEP8风格指南。

Python适合初学者和数据科学,C 适用于系统编程和游戏开发。1.Python简洁易用,适用于数据科学和Web开发。2.C 提供高性能和控制力,适用于游戏开发和系统编程。选择应基于项目需求和个人兴趣。

Python更适合数据科学和快速开发,C 更适合高性能和系统编程。1.Python语法简洁,易于学习,适用于数据处理和科学计算。2.C 语法复杂,但性能优越,常用于游戏开发和系统编程。

每天投入两小时学习Python是可行的。1.学习新知识:用一小时学习新概念,如列表和字典。2.实践和练习:用一小时进行编程练习,如编写小程序。通过合理规划和坚持不懈,你可以在短时间内掌握Python的核心概念。

Python更易学且易用,C 则更强大但复杂。1.Python语法简洁,适合初学者,动态类型和自动内存管理使其易用,但可能导致运行时错误。2.C 提供低级控制和高级特性,适合高性能应用,但学习门槛高,需手动管理内存和类型安全。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器

Atom编辑器mac版下载
最流行的的开源编辑器

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 英文版
推荐:为Win版本,支持代码提示!