字典:格式化字符串

来源:互联网 发布:上海电力学院知乎 编辑:程序博客网 时间:2024/06/05 19:09
在元组里面的时候,就说过格式化字符串,使用字典的格式化的时候:
>>>phonebook= {'wang':'1234', 'zhang':'56778'}
>>>"wang's phone number is  %(wang)s " %phonebook
wang's phone number is 1234


方法:
1.clear ,
清除所有的项,无返回值,或者说返回的是零。
>>>d={}
>>>d['name']='wang'
>>>d['age']='21'
>>>d
{'name':'wang', 'age':'21'}
>>>returnde_value=d.clear()
>>>d
{}
>>>print returned_value
None


2.copy .
复制,产生一个新的字典,不是产生一个副本,这样的复制是浅复制,shallow copy。
>>>x={'username':'admin','machines':['foo','bar','gz']}
>>>y=x.copy()
>>>y
{'username': 'admin', 'machines': ['foo', 'bar', 'gz']}
>>>y['username']='wang'
>>>y['machines'].remove('bar')
>>> y
{'username': 'wang', 'machines': ['foo', 'gz']}
>>> x
{'username': 'admin', 'machines': ['foo', 'gz']}

这样的,原来的值并没有受到影响。
要改变原来的值,用深复制,deep copy,这是一个函数,可以从copy里面来引入。
1>>> from copy import deepcopy
2>>> old={}
3>>> old['names']=['wang','lei']
4>>> old
5{'names': ['wang', 'lei']}
6>>> new=old.copy()
7>>> new
8{'names': ['wang', 'lei']}
9>>> another=deepcopy(old)
10>>> another
11{'names': ['wang', 'lei']}
12>>> old['names'].append('zhang')
13>>> new
14{'names': ['wang', 'lei', 'zhang']}
15>>> another
16{'names': ['wang', 'lei']}

这段代码实在让人搞得头晕,所以一步一步来测试,教材里的这段,已经把我弄晕死了。
仔细分析一下,在前半段,1-8行的时候,old和new是一样的,这个还是浅复制,下面就开始了深复制。9-11行的时候,another 这个字典也是没有改变,可见,单独的用一个deepcopy()显然是不可以的。最主要的是12行的这个句子,在最开始的那个字典里面,追加了一个元素,所以,这次,new这个字典改变了,追加了值,但是another这个字典,还是没有改变。another是被深复制的,所以,他的值还是最初的old。
由此,可以看出,深复制的字典,值是不会随着后来的方法的使用而改变的。逐行分析,就找到了原因。

3.fromkeys ,
,这个是用给定的键值来建立一个新的字典,他的值默认为 None。这个方法字面上来看就是'来自键‘的意思嘛。
>>>{}.fromkeys(['names','age'])
{'names':None,'age':None}
>>>{}.fromkeys(['names','age'],'unkown')
{'names':'unkown','age':'unkown'}


4.get,
一个更加宽松的访问字典项的方法。我还真是不懂这个宽松是什么意思。很有性格的这个方法,别的访问到不存在的东西的时候,一般都会报错,但是,get这个方法不会,他只是显示一个None.
也可以,定义查找不到的时候显示的文字,例如:
>>>d.get('name','N/A')
‘N/A'
如果,存在键的话,就可以直接返回这个键值。
>>>d['name']='wang'
>>>d.get('name')
'wang'
现在算是明白宽松是什么意思了,确实,用这个方法很简单的就可以来查询字典的值。
下面这个代码是一个很好的例子:
#-*- coding: UTF-8 -*-
#使用get()的简单数据库
#这里添加代码
labels={
    'phone':'phone number',
    'addr':'address'
}

name=raw_input('name:')
#查找电话号码还是地址
request=raw_input('phone number (p) or address (a)? ')

#使用正确的键:
key=request
#如果请求既不是’p‘也不是’a’
if request=='p':key='phone'
if request=='a':key='addr'

#使用get()提供默认值:
person=person.get(name.{})
label=labels.get(key,key)
result=person.get(key.'not available')

print "%s's %s is %s," % (name,label,result)

这段代码很有科技含量,真的很不错。其中的request被输入,并且被多次的调用。有点复杂,特别的是倒数第二段的代码,都使用了get()这个,但是里面的参数有所不同。get里面,第一个参数是要查询的键,第二个是要返回的?person.get(name.{}),这个是神马意思??有点纠结,标记一下。

5.has _key,
用来检查 字典是否含有给出的键。d.has_key(m)相当于m in d.在3.0的版本里面没有了该函数,所以这个完全是可以忽略的。
>>>d={}
>>>d.has_key('name')
False
>>>d['name']='wang'
>>>d.has_key('name')
True


6.items和iteritems
将字典里的项转换为列表返回,在顺序上没有什么规定。
>>>d={'name':'wang','phone':'1234','num':'567'}
>>>d.items()
[('phone', '1234'), ('num', '567'), ('name', 'wang')]

这个是我的编辑器显示的结果,但是测试这个iteritems的时候,显示的结果和教材有点不同。
>>>d={'name':'wang','phone':'1234','num':'567'}
>>>d.iteritems()
<dictionary-itemiterator object at 0x84e593c>
>>>list(d)
['phone', 'num', 'name']

只是显示键,不知道为什么和教材的不同。在教材中,说的是这个方法返回的是一个迭代器对象而不是列表,这个确实是没有直接返回一个列表,只是一个对象,到后来使用list()才显示列表。但是这个显示的只是一个键,并没有显示完全的值,标记,值得以后继续探讨。
好像找到了问题,继续实验一下:
>>>d={'name':'wang','phone':'1234','num':'567'}
>>>e=d.iteritems()
>>>e
<dictionary-itemiterator object at 0x84e5914>
>>> list(e)
[('phone', '1234'), ('num', '567'), ('name', 'wang')]
这样就和教材是一样的了。原来看来是一样的使用,结果却不同。这样就知道为什么了。对于后者,不可以直接list(d),必须要使用另外一个变量来代替使用,否则不会产生这样得效果。

7.keys和iterkeys
    keys将字典中的键以列表的形式返回,而iterkeys则是返回针对键的迭代器。呵呵,这回有意思了,上面的那个items那两个不就是这个意思吗??看看这两个到底是什么意思。
>>>d={'name':'wang','phone':'1234','num':'567'}
>>>d.keys()
['phone', 'num', 'name']
>>>d.iterkeys()
<dictionary-keyiterator object at 0x84e59b4>
>>>list(d)
['phone', 'num', 'name']
奇怪了,这两个返回的竟然是一样的值。第一个keys()就相当iteritems这个方法了。为了避免和iteritems同样的错误,
改变一下。
>>>d={'name':'wang','phone':'1234','num':'567'}
>>>e=d.iterkeys()
>>>e
<dictionary-keyiterator object at 0x84e598c>
>>> list(e)
['phone', 'num', 'name']

这次结果是相同的。没有什么区别。

这一章的方法真是多,先吃饭,慢慢学习。身体是革命的本钱。

续:
回来继续写
8.pop(),
  这个词语出场率真是高。在列表的时候,他就出来过,在列表里面,他是默认删除最后一个元素,而在字典里面,用来移除给定的键值。
>>>d={'x':1,'y':2}
>>>d.pop('x')
1
>>>d
{'y': 2}

可见,第一次的时候,还显示了这个删除的值。

9.popitem
 这个方法类似于list.pop,刚刚说完pop(),现在这个词语就来了,这个popitem功能和pop可以说是很相似了,只是在字典里面,并没有顺序的概念,所以,这个是删除一个随机的项。要逐个删除项,这个方法很有效,教材注释说因为不用首先获取键的列表。也是,这样的随便的删除,
的确是很有效率。
>>> d
{'y': 2}
>>> d={'x':1,'y':2,'z':3}
>>> d.popitem()
('y', 2)
>>> d
{'x': 1, 'z': 3}

因为字典没有顺序之分,所以没有了像列表中的append()方法

10.setdefault
 字面意思是设置为默认,这个和get的方法有点类似,都可以查询到与给定的键相关的值。但是它可以在查询不到的时候,将要查询的键或者值给添加进去。
>>> d={}
>>> d.setdefault('name')
>>> d
{'name': None}
>>> d.setdefault('add','here')
'here'
>>> d
{'add': 'here', 'name': None}

呵呵,这个方法挺有意思,在不存的时候给添加了值。

11.update
这个方法可以利用一个字典更新另外一个字典,这句话我也不是很明白,看例子:
>>> d={'name':'wang','add':'here','num':'123'}
>>> e={'title':'hello,everyone'}
>>> d.update(e)
>>> d
{'add': 'here', 'num': '123', 'name': 'wang', 'title': 'hello,everyone'}

看起来就是把字典e添加到了d里面,教材里面还说若有相同的键,就会进行覆盖。
update可以与dict函数或者其他类型构造函数一起进行调用,这样就可以用dict函数来转换其他类型为字典,然后用update方法来进行添加或者连接起来。

12.values和itervalues
好了,这个是最后一个方法,这个字典的方法真是多。这里又出现了这个iter前缀,综合上面的东西,可以推测这个是和迭代器相关的东西。
values是以列表的形式返回字典的值,在itervalues中是返回值的迭代器,话说这个迭代器是神马意思,呵呵 ,我也不知道,只知道它是一个对象,不过慢慢就会知道了,前面的标注,有的已经解决了,就是后来学着学着就明白了,慢慢来,后面会明白的。
先看这个例子:
>>> e={'title':'hello,everyone'}
>>> e.values()
['hello,everyone']
>>> x=e.itervalues()
>>> x
<dictionary-valueiterator object at 0x8f4d9b4>
>>> list(x)
['hello,everyone']

在这里,发现,好像使用这个迭代器的时候,要用别的值来接收它的这个对象,应该是改变了原来的值,变为了对象,所以刚刚输入x的时候,出现的是<dictionary-valueiterator object at 0x8f4d9b4>,大概翻译一下,是“字典迭代器值的工程在0x8f4d9b4”这个可能是对象具有的东西,看那最后一串数字,应该是地址。

好了,这个字典也学的告一段落了。主要是方法多,但是看起来,还真是挺有意思的。学习的过程中,不断看看前面的,温故知新,这样最好,时常遇到问题标记也应该算是一种好的习惯,继续学习。