python学习笔记(五)之字典2

python学习笔记(五)之字典2
编程实战中经常用到
实例1:copy

>> ad = {"name":"wtf","hig":"180"}
>> bd = ad
>> bd
{‘name‘: ‘wtf‘, ‘hig‘: ‘180‘}
>> id (ad)
4539954352
>> id (bd)
4539954352
说明:一个对象贴上两个标签,使用赋值,实现了所谓的“假装拷贝”。
如果使用copy()
>> cd = ad.copy()
>> cd
{‘name‘: ‘wtf‘, ‘hig‘: ‘180‘}
>> id (cd)
4541831160
说明:这次得到的cd于原来的ad是不同的。
如果我修改cd,就应该对原来的ad不会造成什么影响,如下:
>> cd["name"] = "didi"
>> cd
{‘name‘: ‘didi‘, ‘hig‘: ‘180‘}
>> ad
{‘name‘: ‘wtf‘, ‘hig‘: ‘180‘}
如果我修改了bd,则ad也应该跟着改变的,如下:
>> bd["name"] = "aaa"
>> bd
{‘name‘: ‘aaa‘, ‘hig‘: ‘180‘}
>> ad
{‘name‘: ‘aaa‘, ‘hig‘: ‘180‘}

关于python中的浅拷贝与深拷贝
浅拷贝
实例2:元组中含有列表

>> x = {"name":"wtf","lang":["python","java"]}
>> type(x)
<type ‘dict‘>
>> y = x.copy()
>> y
{‘lang‘: [‘python‘, ‘java‘], ‘name‘: ‘wtf‘}
>> id(x)
4529826624
>> id(y)
4529826344
说明:y是从x拷贝过来的,两个在内存中是不同的对象。
现在键“lang”的值是一个列表,为[‘python‘, ‘java‘],这里用remove()这个列表方法删除其中的一个元素“java”。删除之后,这个列表就变为:[‘python‘],操作如下:
>> y["lang"].remove("java")
>> y
{‘lang‘: [‘python‘], ‘name‘: ‘wtf‘}
按照实例1,它是另一个对象,x应该是不会改变的,则:
>> x
{‘lang‘: [‘python‘], ‘name‘: ‘wtf‘}
x竟然改变啦!!
下面我们使用id()来分析下:
>> id(x)
4529826624
>> id(y)
4529826344
说明:x,y确实对应着两个不同的对象,但是这个对象(字典)是由两个键值组成的,其中一个键的值是列表。
>> id(x["lang"])
4529661856
>> id(y["lang"])
4529661856
说明:列表竟然是同一个对象!!
原因解释:
python在所执行的复制动作中,如果是基本类型的对象(专值数字和字符串),就在内存中重新建个窝;如果不是基本类型的,就不建新窝,而是用标签引用原来的窝。

深拷贝
python中的深拷贝就是使用import来导入一个模块。
实例3:

>> import copy
>> z = copy.deepcopy(x)
>> z
{‘lang‘: [‘python‘], ‘name‘: ‘wtf‘}
>> id(x["lang"])
4529661856
>> id(z["lang"])
4529828136
说明:果然是新建了一个窝,而不是引用啦!
此时,如果修改其中一个,应该不影响另一个。
实例4:
>> x
{‘lang‘: [‘python‘], ‘name‘: ‘wtf‘}
>> x["lang"].remove("python")
>> x
{‘lang‘: [], ‘name‘: ‘wtf‘}
>> z
{‘lang‘: [‘python‘], ‘name‘: ‘wtf‘}

clear
说明:在交互模式下,用help()是一个很好的习惯。
clear是一个清空字典中所有元素的操作
实例5:

>> x
{‘lang‘: [], ‘name‘: ‘wtf‘}
>> x.clear()
>> x
{}
说明:将字典清空,得到一个“空”字典。
del()是将字典删除,内存中就没有它了,不是为“空”。
实例6:
>> y
{‘lang‘: [], ‘name‘: ‘wtf‘}
>> del(y)
>> y
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name ‘y‘ is not defined

get,setdefault
get的含义是:
help(dict.get)
get(...)
D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.
说明:“if k in D”,就返回其值
实例7:

>> d
{‘lang‘: ‘python‘}
>> d.get("lang")
‘python‘
说明:dict.get()就是要得到字典中某个键的值,其实,
>> d["lang"]
‘python‘
也可以得到。
但是,如果是不存在的值,则:
实例8:
>> print d.get("name")
None
>> d["name"]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: ‘name‘
说明:这就是dict.get()与dict["key]的区别。

前面有一个半句话,如果键不在字典中,会返回none,这是一种情况。还可以这样:
实例9:

>> d
{‘lang‘: ‘python‘}
>> newd = d.get("name","didi")
>> newd
‘didi‘
>> d
{‘lang‘: ‘python‘}
说明:以d.get("name","didi")的方式,如果不能得到键"name"的值,就返回后面指定的值"didi"。这就是文档中D.get(k[,d]) -> D[k] if k in D, else d.的含义。这样做,并没有影响原来的字典。

setdefault
help(dict.setdefault)
含义:D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D
说明:与get的功能上有相似的地方。
实例10:

>> d
{‘lang‘: ‘python‘}
>> d.setdefault("lang")
‘python‘
>> d.setdefault("name","didi")
‘didi‘
>> d
{‘lang‘: ‘python‘, ‘name‘: ‘didi‘}
说明:没有"name"这个键,于是就返回d.setdefault("name","didi")指定的值"didi",并且将键值对"name":"didi"添加到原来的字典中。

如果是这样的:
实例11:

>> d.setdefault("web")
>> print d
{‘lang‘: ‘python‘, ‘web‘: None, ‘name‘: ‘didi‘}
说明:键"web"的值变成了“None”

items/iteritems,keys/iterkeys,values/itervalues
说明:在pytho3中不再需要:iteritems,iterkeys,itervalues
? ~ python --version
Python 2.7.10

>> help(dict.items)
items(...)
D.items() -> list of D‘s (key, value) pairs, as 2-tuples
实例12:
>> dd = {"name":"wtf","lang":"java","web":"www.datagrand.com"}
>> dd_kv = dd.items()
>> dd_kv
[(‘lang‘, ‘java‘), (‘web‘, ‘www.datagrand.com‘), (‘name‘, ‘wtf‘)]
说明:这种操作对循环有大用。

>> help(dict.iteritems)
iteritems(...)
D.iteritems() -> an iterator over the (key, value) items of D
实例13:
>> dd
{‘lang‘: ‘java‘, ‘web‘: ‘www.datagrand.com‘, ‘name‘: ‘wtf‘}
>> dd_iter = dd.iteritems()
>> type(dd_iter)
<type ‘dictionary-itemiterator‘>
>> dd_iter
<dictionary-itemiterator object at 0x106f56a48>
>> list(dd_iter)
[(‘lang‘, ‘java‘), (‘web‘, ‘www.datagrand.com‘), (‘name‘, ‘wtf‘)]
说明:得到的dd_iter的类型,是一个“dictionary-itemiterator”类型,不过这种迭代器类型的数据不能直接输出,必须用list()转换一下,才能看到里面的真面目。
另外两组与item/iteritems含义相似。

pop,popitem
说明:在列表中,有关删除列表中元素的函数pop和remove,这两个的区别在于:list.remove(x)用来删除指定的元素,而list.pop[i]用来删除指定索引的元素,如果不提供索引值,就默认删除最后一个。
在字典中,也有删除键值对的函数

>> help(dict.pop)
pop(...)
D.pop(k[,d]) -> v, remove specified key and return the corresponding value.
If key is not found, d is returned if given, otherwise KeyError is raised
其中,D.pop(k[,d])是以字典的键为参数,删除指定键的键值对。
实例14:
>> dd
{‘lang‘: ‘java‘, ‘web‘: ‘www.datagrand.com‘, ‘name‘: ‘wtf‘}
>> dd.pop("name")
‘wtf‘
>> dd
{‘lang‘: ‘java‘, ‘web‘: ‘www.datagrand.com‘}
值得注意的是,字典中pop函数的参数是不能省略的,这跟列表中的那个pop有所不同。
实例15:
>> dd.pop()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: pop expected at least 1 arguments, got 0

如果删除字典中没有的键值对,也会报错:
实例16:

>> dd
{‘lang‘: ‘java‘, ‘web‘: ‘www.datagrand.com‘}
>> dd.pop("name")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: ‘name‘

popitem

>> help(dict.popitem)
popitem(...)
D.popitem() -> (k, v), remove and return some (key, value) pair as a
2-tuple; but raise KeyError if D is empty.
说明:D.popitem()与list.pop()有相似之处。
实例17:
>> dd
{‘lang‘: ‘java‘, ‘web‘: ‘www.datagrand.com‘}
>> dd.popitem()
(‘lang‘, ‘java‘)
>> dd
{‘web‘: ‘www.datagrand.com‘}
说明:随机删除一对
>> dd.popitem()
(‘web‘, ‘www.datagrand.com‘)
>> dd
{}
已经把字典变成空,再删:
>> dd.popitem()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: ‘popitem(): dictionary is empty‘
说明:告知没有东西可删除啦

update
说明:更新字典

>> help(dict.update)
update(...)
D.update([E, ]**F) -> None. Update D from dict/iterable E and F.
If E present and has a .keys() method, does: for k in E: D[k] = E[k]
If E present and lacks .keys() method, does: for (k, v) in E: D[k] = v
In either case, this is followed by: for k in F: D[k] = F[k]
说明:这个函数没有返回值,或者说返回值是none,它的作用就是更新字典。其参数可以是字典或者某种可迭代的对象。
实例18:
>> d1 = {"lang":"python"}
>> d2 = {"name":"wtf"}
>> d1.update(d2)
>> d1
{‘lang‘: ‘python‘, ‘name‘: ‘wtf‘}
>> d2
{‘name‘: ‘wtf‘}
说明:字典d2更新入了d1那个字典,于是d1中就多了一些内容,把d2的内容包含了进来,d2内容保持不变。
还可以以下面这种方式更新:
实例19:
>> d2
{‘name‘: ‘wtf‘}
>> d2.update([("song","xingxing"),("web","www.baidu.com")])
>> d2
{‘web‘: ‘www.baidu.com‘, ‘name‘: ‘wtf‘, ‘song‘: ‘xingxing‘}

has_key
说明:目前仅在python2中存在,python3中将其取消了
这个函数的功能就是判断字典中是否存在某个键,跟"k in d"类似。

>> help(dict.has_key)
has_key(...)
D.has_key(k) -> True if D has a key k, else False
实例20:
>> d2
{‘web‘: ‘www.baidu.com‘, ‘name‘: ‘wtf‘, ‘song‘: ‘xingxing‘}
>> d2.has_key("web")
True

原文地址:http://blog.51cto.com/wutengfei/2058626

时间: 2024-10-07 15:16:51

python学习笔记(五)之字典2的相关文章

python学习笔记4:字典

python学习笔记4:字典 总结:字典是可变变量: 字典是不排序的,所以不能像列表,元组,字符串一样,切片 1.定义字典dict  --花括号{},字典的只是key-value形式 比如:stu={'name':'zhangying','age':18,'score'=99} 2.key取值,get()方法取值 1)dictname[key] , 取key对应的value值,如果不存在,报错 2)dictname.get(key) , 取key对应的value值,如果不存在,返回none:还可

Python学习笔记五:字符串常用操作,字典,三级菜单实例

字符串常用操作 7月19日,7月20日 ,7月22日,7月29日,8月29日,2月29日 首字母大写:a_str.capitalize() 统计字符串个数:a_str.count("x") 输出字符,不够的使用指定的字符补上,字符居中:a_str.center(50,"-") 判断字符串以什么结尾:a_str.endwith("xx") 将字符串中的tab转换为指定数目的空格:a_str.expandtabs(tabsize=30) 查找指定字符

python学习笔记(五):装饰器、生成器、内置函数、json

这周学习了装饰器和生成器,写下博客,记录一下装饰器和生成器相关的内容. 一.装饰器 装饰器,这个器就是函数的意思,连起来,就是装饰函数,装饰器本身也是一个函数,它的作用是用来给其他函数添加新功能,比如说,我以前写了很多代码,系统已经上线了,但是性能比较不好,现在想把程序里面每个函数都加一个功能,用来统计每个函数的运行时间是多少,找出来运行比较慢的函数,来优化代码,就需要添加一个新的功能,来统计程序的运行时间,那这样的话,就得修改每个函数了,需要改代码,但是代码特别多,改完了公司倒闭了,这时候装饰

Python学习笔记五(模块与包)

一.模块 1.模块介绍 一个模块就是包含了一组功能的python文件,可以通过import导入模块使用. python中模块分为四个类别: a) 使用python编写的.py文件 b) 已被编译为共享库或DLL的C或C++扩展 c) 把一系列模块组织到一起的文件夹,文件夹内有__init__.py文件,称该文件夹为包 d) 使用C编写并链接到python解释器的内置模块 定义my_module.py模块,模块名为my_module print("from my_module.py")

Python学习笔记五_数据类型(字符串)

已经学习过的数据类型包括:int.float.list.tuple.dict.这篇来单独记录下字符串.单独将字符串这种数据类型写出来,是因为python里有很多非常有用的字符串内置方法. 一.字符串定义 字符串可以存任意类型的字符串,比如名字,一句话等等. 1 name = 'Rebecca' 2 msg = 'Fighting' 二.字符串内置方法 1.常用方法 输出为字符串的方法 a = 'my name is Rebecca' print(a.capitalize()) #将字符串的第一个

python学习笔记六:字典

字典是python中唯一内建的映射类型. 特点: 没有特殊的顺序: 存储在特定的键(key)下,可以是数字.字符串甚至是元组 创建和使用字典 phonebook= {'Alice':'2341', 'Beth':'9102','Cecil':'3258'} a.由键-值组成,上述例子中,名字是键,电话号码是值 b.键与值用冒号(:)隔开 c.每一对键-值使用逗号(,)隔开 d.整个字典由一对大括号括起来 e.空字典:{} dict函数 >>> items = [('name','Gumb

Python学习笔记五:错误、调试和测试

1 # !/usr/bin/env python 2 # coding:utf-8 # 编码 3 4 'a test module' 5 6 __author__ = 'Sunflower' 7 8 9 # 异常错误类型 10 # AssertionError 断句错误 11 try: 12 my_list =['zhangsan'] 13 assert len(my_list) > 0 14 my_list.pop() 15 assert len(my_list) > 0 16 except

Python学习笔记五:数字和字符串

数据类型是不允许改变的,这就意味着如果改变数字数据类型得值,将重新分配内存空间. Python数字类型转换 int(x [,base ]) 将x转换为一个整数 long(x [,base ]) 将x转换为一个长整数 float(x ) 将x转换到一个浮点数 complex(real [,imag ]) 创建一个复数 str(x ) 将对象 x 转换为字符串 repr(x ) 将对象 x 转换为表达式字符串 eval(str ) 用来计算在字符串中的有效Python表达式,并返回一个对象 tupl

Python学习笔记五--条件和循环

5.1 if语句 没什么好说,if语句语法如下: if expression: expr_true_suit 5.1.1多重条件表达式 单个if语句可以通过布尔操作符and,or,not实现多重条件判断或否定判断. if not warn and (system_load>=10): print 'WARNING:LOSING RESOURCE' warn+=1 5.2 else 语句 如果if条件为假程序将执行else后的语句. if expression: expr_true_suit el

python学习笔记(五) - 模块

一. 使用模块 引入sys模块,使用import #!/usr/bin/env python # -*- coding: utf-8 -*- ' a test module ' __author__ = 'Michael Liao' import sys def test(): args = sys.argv if len(args)==1: print 'Hello, world!' elif len(args)==2: print 'Hello, %s!' % args[1] else: p