字典的创建

字典的键可以是整型、字符串、浮点型、甚至元组
更神奇的是,访问字典时键可以是变量呢!!

In [5]:
#直接创建
#字典名={键:值,........}
In [2]:
phonebook = {'Zk' : '510', 'Zps' : '877', 'Jqj' : '177'}
In [3]:
phonebook
Out[3]:
{'Jqj': '177', 'Zk': '510', 'Zps': '877'}
In [4]:
phonebook['Zk']
Out[4]:
'510'
In [6]:
#利用dict函数,将其他映射对应建立字典
In [10]:
item = [('Zk', '510'), ('Zps', '877')]
In [11]:
pbook = dict(item)
In [12]:
pbook
Out[12]:
{'Zk': '510', 'Zps': '877'}
In [13]:
#也可以直接用dict函数的参数创建字典
#此时键只能是字符串,参数里的键不需要加引号!!
In [18]:
ppbook = dict(Zk = '510', Zps = '877')
In [15]:
ppbook
Out[15]:
{'Zk': '510', 'Zps': '877'}
In [19]:
#成员资格(in)查找的是键,而不是值!!
'Zk' in ppbook
Out[19]:
True
In [20]:
'510' in ppbook
Out[20]:
False
In [21]:
#列表不能给任意索引赋值,字典可以!
#列表不能直接赋值来追加元素,字典可以!
In [22]:
a = []
In [23]:
a[42] = 'a'
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-23-7dde01b75258> in <module>()
----> 1 a[42] = 'a'

IndexError: list assignment index out of range
In [24]:
b = {}
In [25]:
b[42] = 'b'
In [26]:
b
Out[26]:
{42: 'b'}

字典的格式化字符串

此时的键必须是字符串哦!!

In [28]:
ppbook
Out[28]:
{'Zk': '510', 'Zps': '877'}
In [29]:
"Zk's phone number is %(Zk)s." % ppbook
Out[29]:
"Zk's phone number is 510."

字典方法

  • clear:清空字典,不返回值
In [39]:
phonebook
Out[39]:
{'Jqj': '177', 'Zk': '510', 'Zps': '877'}
In [40]:
phonebook.clear()
In [41]:
phonebook
Out[41]:
{}

x={}和x.clear()可是有区别的哦哦哦哦哦!!!
x={}不影响与x关联的字典,但是x.clear()会把相关联的字典都清空了!

In [43]:
x = {'Name': 'Zk'}
In [44]:
y = x
In [47]:
y
Out[47]:
{'Name': 'Zk'}
In [48]:
x = {}
In [49]:
y
Out[49]:
{'Name': 'Zk'}
In [50]:
#######################
In [51]:
x = {'Name': 'Zk'}
In [52]:
y = x
In [53]:
y
Out[53]:
{'Name': 'Zk'}
In [54]:
x.clear()
In [55]:
y
Out[55]:
{}
  • copy:浅复制(shallow copy),返回一个相同键-值对的新字典
    替换值不影响原始字典
    但是原地修改(比如一些方法)会影响到原始字典
In [57]:
x = {
    'username' : 'admin', 
    'machines' : ['foo', 'bar', 'baz']
}
In [58]:
y = x.copy()
In [59]:
y['username'] = 'zk'   #直接替换值
In [61]:
y['machines'].remove('bar')   #remove方法是原地操作的
In [62]:
x
Out[62]:
{'machines': ['foo', 'baz'], 'username': 'admin'}
In [63]:
y
Out[63]:
{'machines': ['foo', 'baz'], 'username': 'zk'}
In [64]:
#可以看到
#y的admin被替换成了zk,x不变
#y的machines少了一个bar,x的bar也不见了咧!!
  • deep copy()函数:深复制,即使在原地操作也不影响原始字典
In [66]:
from copy import deepcopy
In [67]:
x
Out[67]:
{'machines': ['foo', 'baz'], 'username': 'admin'}
In [68]:
y = deepcopy(x)
In [69]:
y['machines'].append('bar')
In [70]:
x
Out[70]:
{'machines': ['foo', 'baz'], 'username': 'admin'}
In [71]:
y
Out[71]:
{'machines': ['foo', 'baz', 'bar'], 'username': 'admin'}
  • fromkeys:(注意是复数)使用给定的键建立一个默认值都为None的字典,返回该字典
In [74]:
{}.fromkeys(['name', 'age'])
Out[74]:
{'age': None, 'name': None}
In [75]:
#也可以不先建立空字典{},而直接在dict类型上操作
dict.fromkeys(['name', 'age'])
Out[75]:
{'age': None, 'name': None}
In [76]:
#也可以自行指定默认值
dict.fromkeys(['name', 'age'], '(unknown)')
Out[76]:
{'age': '(unknown)', 'name': '(unknown)'}
  • get:更宽松的访问字典项,即使不存在项也不会出错
In [77]:
d = {}
In [78]:
d['name'] 
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-78-b2a947adae93> in <module>()
----> 1 d['name']

KeyError: 'name'
In [79]:
#哼哼,直接访问可是会出错的哦!
In [81]:
print( d.get('name') )
None

In [82]:
#同样的,也可以来指定默认值
print( d.get('name', 'N/A') )
N/A

  • has_key:相当于in,但是python3不支持,还是别用的号
    ……
  • items:以列表的方式返回字典的所有项,列表中为(键, 值)形式的元组
In [83]:
pbook
Out[83]:
{'Zk': '510', 'Zps': '877'}
In [84]:
pbook.items()
Out[84]:
[('Zps', '877'), ('Zk', '510')]
  • iteritems:与items类似,但是返回的是以个迭代器对象,而不是列表
In [86]:
pbook.iteritems()
Out[86]:
<dictionary-itemiterator at 0x7f947ace4aa0>
  • keys:以列表的方式返回字典的所有键
In [87]:
pbook
Out[87]:
{'Zk': '510', 'Zps': '877'}
In [88]:
pbook.keys()
Out[88]:
['Zps', 'Zk']
  • iterkeys:与keys类似,返回一个迭代器对象
In [89]:
pbook.iterkeys()
Out[89]:
<dictionary-keyiterator at 0x7f947ace4d60>
  • pop:获得指定键的值,并把它移除
In [90]:
pbook
Out[90]:
{'Zk': '510', 'Zps': '877'}
In [91]:
pbook.pop('Zk')
Out[91]:
'510'
In [92]:
pbook
Out[92]:
{'Zps': '877'}
  • popitem:与pop类似,但是它是取出一个随机项(不是最后一项,字典是没有顺序的啊!!)
    ……
  • setdefault:get的升级版,如果键不存在,它会主动去创建这个键!
In [93]:
pbook
Out[93]:
{'Zps': '877'}
In [94]:
pbook.setdefault('Zk', 'N/A')
Out[94]:
'N/A'
In [95]:
pbook
Out[95]:
{'Zk': 'N/A', 'Zps': '877'}
  • update:用一个字典(参数)去更新另一个字典,也就是说如果有相同的键,那么覆盖它的值;如果没有,那么把新项添加上去,不返回值
In [97]:
pbook
Out[97]:
{'Zk': 'N/A', 'Zps': '877'}
In [98]:
n_pbook = {
    'Zk' : '510',
    'Jqj' :'177'
}
In [99]:
pbook.update(n_pbook)
In [100]:
pbook
Out[100]:
{'Jqj': '177', 'Zk': '510', 'Zps': '877'}
In [101]:
#可以看到,Zk的值被改变,Zps的值不变,新增了Jqj
  • values:以列表的形式返回字典的所有值
In [102]:
pbook
Out[102]:
{'Jqj': '177', 'Zk': '510', 'Zps': '877'}
In [103]:
pbook.values()
Out[103]:
['877', '177', '510']
  • itervalues:与values类似,但是返回的是一个迭代器对象
    ……
In []: