字典的高级特性

一、字典中的键映射多个值

一个字典就是一个键对应一个单值得映射,如果你想要一个键映射多个值,那么你就需要将多个值放到另外的容器中(如列表,集合),你可以像下面这样构造字典

d = {    ‘a‘:[1,2,3],    ‘b‘:[4,5]}e = {    ‘a‘:{1,2,3},    ‘b‘:{4,5}}选择列表还是集合取决于你的需求,如果你想保持元素的插入顺序就应该使用列表,如果想去掉重复元素就使用集合(并且不关心元素的顺序问题)你可以很方便的使用collections模块中的defaultdict来构造这样的字典,defaultdict的一个特征是它会自动初始化每个key刚开始对应的值,所以你只需要关注添加元素的操作。代码示例:
d = defaultdict(list)d[‘a‘].append(1)d[‘a‘].append(2)d[‘a‘].append(3)d[‘b‘].append(4)d[‘b‘].append(5)print(d)  ->defaultdict(<class ‘list‘>, {‘a‘: [1, 2, 3], ‘b‘: [4, 5]})-----------------------
e = defaultdict(set)e[‘a‘].add(1)e[‘a‘].add(2)e[‘a‘].add(3)e[‘b‘].add(4)e[‘b‘].add(5)print(e) ->defaultdict(<class ‘set‘>, {‘b‘: {4, 5}, ‘a‘: {1, 2, 3}})需要注意的是,defaultdict会自动为将要访问的键(就算目前字典中并不存在这样的键)创建映射实体。如果你不要这样的特性,可以使用setdefault()来代替,用法详见python基础中的字典这篇文章其实defaultdict可以与setdefault结合使用
e = defaultdict(list)  #初始化字典,key与list对应e[‘a‘].append(1)e[‘a‘].append(2)e.setdefault(‘c‘,set([]))  #key与集合对应e[‘c‘].add(3)e[‘d‘].append(5)print(e)
二、字典排序你想创建一个字典,并且在迭代或序列化这个字典的时候能够控制元素的顺序。你能想到用什么方法?方案:  为了能控制字典中元素的顺序,你可以使用collections模块中的 OrdereDict类。在迭代操作的时候它会保持元素的插入顺序代码示例:
def orderedict():    d = OrderedDict()    d[‘foo‘] = 1    d[‘bar‘] = 2    d[‘spam‘] = 3    print(d[‘bar‘])orderedict()结果:OrderedDict([(‘foo‘, 1), (‘bar‘, 2), (‘spam‘, 3)])当你想要构建一个将来需要序列化或编码成其他格式的映射的时候,OrdereDict是非常有用的。比如,你想精确控制以JSON编码后字段的顺序。
def orderedict():    d = OrderedDict()    d[‘foo‘] = 1    d[‘bar‘] = 2    d[‘spam‘] = 3

f = open("a",‘w‘)    json.dump(d,f)    f.close()

orderedict()结果:文件a中的格式为:{"foo": 1, "bar": 2, "spam": 3}讨论:OrdereDict内部维护着一个根据键插入顺序的双向链表。每次当一个新的元素插进来的时候,它就会被放到链表的尾部。对于一个已经存在的键的重复赋值不会改变键的顺序需要注意的是,一个OrdereDict的大小是一个普通字典的2倍,因为它内部维护着另一个链表。对一个已经存在的字典排序可以用sorted方法,详见python基础里的内建函数
 

				
时间: 2024-08-06 10:11:55

字典的高级特性的相关文章

python基础知识5(集合,高级特性,高阶函数)

** 删除列表中重复的元素:l = [1,2,3,1,2,3] - 强制转化列表为集合类型:list(set(l)) - 将列表转化为字典,拿出里面的所有key值: dict.fromkeys(l).keys() ** 实现switch的两种方法: - if...elif...else... - 通过字典实现: d= {"key",func} if oper in d.keys(): d[oper]() else: print "error" # 集合 ## 集合的

Python高级特性(3): Classes和Metaclasses(转)

原文:Python高级特性(3): Classes和Metaclasses 类和对象 类和函数一样都是Python中的对象.当一个类定义完成之后,Python将创建一个“类对象”并将其赋值给一个同名变量.类是type类型的对象(是不是有点拗口?). 类对象是可调用的(callable,实现了 __call__方法),并且调用它能够创建类的对象.你可以将类当做其他对象那么处理.例如,你能够给它们的属性赋值,你能够将它们赋值给一个变量,你 可以在任何可调用对象能够用的地方使用它们,比如在一个map中

Python高级特性(2):Closures、Decorators和functools(转)

原文:Python高级特性(2):Closures.Decorators和functools 装饰器(Decorators) 装饰器是这样一种设计模式:如果一个类希望添加其他类的一些功能,而不希望通过继承或是直接修改源代码实现,那么可以使用装饰器模式.简单来说 Python中的装饰器就是指某些函数或其他可调用对象,以函数或类作为可选输入参数,然后返回函数或类的形式.通过这个在Python2.6版本中被新 加入的特性可以用来实现装饰器设计模式. 顺便提一句,在继续阅读之前,如果你对Python中的

函数,高级特性

4.调用函数 (1)Python 内置了很多有用的函数,我们可以直接调用: abs()  ##########求绝对值 cmp()   #########比较大小fact()   #############递归函数实现 cmp截图: 练习:############实现递归函数##################################################### n! = 1x2x3x4x.......(n-1)xn= (n-1)!xn = (n-2)!x(n-1)xn1!  

python4:高级特性

4 高级特性 4.1  切片 [:] *注:-- list和tuple,字符串都支持切片 4.2 迭代 Iteration for ... in 及 for ... in if 两个变量迭代时, 例1:数组>>> for x, y in [(1, 1), (2, 4), (3, 9)]: 结果1 1 -- 2 4 -- 3 9例2:字典>>>d={'x':'A','y':'B','z':'C'} >>> for k,v in d.items(): 或者

Python进阶:全面解读高级特性之切片!

导读:切片系列文章连续写了三篇,本文是对它们做的汇总.为什么要把序列文章合并呢?在此说明一下,本文绝不是简单地将它们做了合并,主要是修正了一些严重的错误(如自定义序列切片的部分),还对行文结构与章节衔接做了大量改动,如此一来,本文结构的完整性与内容的质量都得到了很好的保证. 众所周知,我们可以通过索引值(或称下标)来查找序列类型(如字符串.列表.元组-)中的单个元素,那么,如果要获取一个索引区间的元素该怎么办呢? 切片(slice)就是一种截取索引片段的技术,借助切片技术,我们可以十分灵活地处理

MapReduce编程实战之“高级特性”

本篇介绍MapReduce的一些高级特性,如计数器.数据集的排序和连接.计数器是一种收集作业统计信息的有效手段,排序是MapReduce的核心技术,MapReduce也能够执行大型数据集间的""连接(join)操作. 计数器 计数器是一种收集作业统计信息的有效手段,用于质量控制或应用级统计.计数器还可用于辅助诊断系统故障.对于大型分布式系统来说,获取计数器比分析日志文件容易的多. 示例一:气温缺失及不规则数据计数器 import java.io.IOException; import

javascript高级特性

01_javascript相关内容02_函数_Arguments对象03_函数_变量的作用域04_函数_特殊函数05_闭包_作用域链&闭包06_闭包_循环中的闭包07_对象_定义普通对象08_对象_定义函数对象09_对象_内建对象10_原型_为函数对象增加属性或方法11_原型_利用函数对象本身重写原型12_继承_函数对象之间的继承13_继承_普通对象之间的继承 javascript高级特性(面向对象): * 面向对象:   * 面向对象和面向过程的区别:     * 面向对象:人就是对象,年龄\

python之高级特性

掌握了Python的数据类型.语句和函数,基本上就可以编写出很多有用的程序了. 比如构造一个1, 3, 5, 7, ..., 99的列表,可以通过循环实现: L = [] n = 1 while n <= 99: L.append(n) n = n + 2 取list的前一半的元素,也可以通过循环实现. 但是在Python中,代码不是越多越好,而是越少越好.代码不是越复杂越好,而是越简单越好. 基于这一思想,我们来介绍Python中非常有用的高级特性,1行代码能实现的功能,决不写5行代码.请始终