字典:当索引不好用时

字典是唯一内建的映射类型,字典中的键可以是数字、字符串甚至元组

字典的使用

字典——通过轻松查找某个键,找到它的值
字典比列表更适用于以下情况:

  • 表示一个游戏棋盘的状态,每个键都是由坐标值组成的元组
  • 储存文件修改时间,用文件名作为键
  • 数字电话/地址簿

创建和使用字典

字典由多个及与其对应的组成的键-值对组成。每个键和它的值之间用:隔开,项之间用,隔开,整个字典由一对大括号括起来。

dict函数

可以用dict函数,通过其他映射(其他字典)或者键-值对序列建立字典。
dict函数也可以通过关键字参数来创建字典:

>>> d = dict(name='Gumby', age=42)
>>> d
{'age':42 , 'name'='Gumby'}

基本字典操作

  • len(d)返回d中项(键值对)的数量
  • d[k]返回关联到键k上的值
  • d[k] = v 将值v关联到键k上
  • del d[k] 删除键为k的项
  • k in d检查d中是否含有键为k的项
    字典和列表的重要区别:
  • 键类型:字典的键不一定为整形数据,键可以是任意的不可变类型,比如浮点数、字符串或者元组
  • 自动添加:即使键期初在字典中并不存在,也可以为它赋值,这样字典就会建立新的项,而不能将值关联到列表范围之外的索引上。
  • 成员资格:表达式k in d查找的是键,而不是值。表达式v in l则用来查找值,而不是索引。

字典示例

# A simple database

# A dictionary with person names as keys.  Each person is represented as
# another dictionary with the keys 'phone' and 'addr' referring to their phone
# number and address, respectively.
people = {

    'Alice': {
        'phone': '2341',
        'addr': 'Foo drive 23'
    },

    'Beth': {
        'phone': '9102',
        'addr': 'Bar street 42'
    },

    'Cecil': {
        'phone': '3158',
        'addr': 'Baz avenue 90'
    }

}

# Descriptive labels for the phone number and address. These will be used
# when printing the output.
labels = {
    'phone': 'phone number',
    'addr': 'address'
}

name = raw_input('Name: ')

# Are we looking for a phone number or an address?
request = raw_input('Phone number (p) or address (a)? ')

# Use the correct key:
if request == 'p': key = 'phone'
if request == 'a': key = 'addr'

# Only try to print the information if the name is a valid key in our dictionary:
if name in people: print "%s's %s is %s." % (name, labels[key], people[name][key])

字典的格式化字符串

在每个转换说明符中%字符后面,加上键(用圆括号括起来),后面再跟上其他说明:

>>> phonebook
{'Bill': '1901', 'Tom': '9546', 'Cecil': '9643'}
>>> 'Bill's phone number is %(Bill)s.' % phonebook
'Bill's phone number is 1901.'

当用这种方式使用字典时候,只要所有给出的键都能在字典中找到,就可以使用任意数量的转换说明符。

template = '''
    %(title)s
    
    

%(title)s

%(text)s

''' data = {'title': 'My Home Page', 'text': 'Welcome to my home page!'} print template % data

字典方法

  • clear方法
    clear方法清除字典中所有的项。这是个原地操作(类似list,sort),所以无返回值(或者返回None)
    这种方法在需要情况原始字典中所有的元素(包括清空同一个字典对应的不同变量时候),必须使用clear方法。
  • copy方法
    copy方法返回一个具有相同键值对的新字典(这个方法实现的是浅复制,因为值本身就是相同的,而不是副本)
>>> x = {'username' : 'admin', 'machines' : ['foo', 'bar', 'boz']}
>>> y = x.copy()
>>> y['username'] = 'mlh'
>>> y['machines'].remove('bar')
>>> y
{'username' : 'mlh', 'machines' : ['foo', 'boz']}
>>> x
{'username' : 'admin', 'machines' : ['foo', 'boz']}

可以看到,当在副本中替换值的时候,原始字典不受影响,但是如果修改了某个值(这里是修改而不是替换),原始字典也会改变,因为同样的值也存储在原始字典中。
避免这一问题的办法就是深复制,复制包含的所有值,可以使用模块deepcopy函数来完成:

>>> from copy import deepcopy
  • fromkeys方法
    fromkeys方法使用给定的键建立新的字典,每个键都对应一个默认的值None:
>>> {}.fromkeys(['name', 'age'])
{'age':None, 'name':None}
  • get方法
    get方法是个更宽松的字典项的方法。一般试图访问字典中并不存在的项时会出错,但是get()不会
>>> d = {}
>>> print d['name']
>>>key Error
>>> print d.get('name')
None

当使用get访问一个不存在的键时,没有任何异常,而是得到了None值,还可以自定义默认值(第二个参数)。

字典方法示例

# A simple database using get()

# Insert database (people) from Listing 4-1 here.

# A simple database

# A dictionary with person names as keys.  Each person is represented as
# another dictionary with the keys 'phone' and 'addr' referring to their phone
# number and address, respectively.
people = {

    'Alice': {
        'phone': '2341',
        'addr': 'Foo drive 23'
    },

    'Beth': {
        'phone': '9102',
        'addr': 'Bar street 42'
    },

    'Cecil': {
        'phone': '3158',
        'addr': 'Baz avenue 90'
    }

}

labels = {
    'phone': 'phone number',
    'addr': 'address'
}

name = raw_input('Name: ')

# Are we looking for a phone number or an address?
request = raw_input('Phone number (p) or address (a)? ')

# Use the correct key:
key = request # In case the request is neither 'p' nor 'a'
if request == 'p': key = 'phone'
if request == 'a': key = 'addr'

# Use get to provide default values:
person = people.get(name, {})
label = labels.get(key, key)
result = person.get(key, 'not available')

print "%s's %s is %s." % (name, label, result)
  • has_key方法
    has_key方法可以检查字典中是否含有特定的键。d.has_key(k)相当于k in d

  • items和iteritems
    items方法将字典所有的项以列表方式返回,列表中的每一项都表示为(键,值)对的形式,但是项在返回时并没有遵循特定的次序。
    iteritems方法的作用大致相同,但是会返回一个迭代器对象而不是列表。

  • keys和iterkeys
    keys方法将字典中的键以列表形式返回,而iterkeys则返回针对键的迭代器。

  • pop
    pop方法用来获得对应于给定键的值,然后将这个键-值对从字典中移除。

  • popitem
    popitem方法类似于list.pop,后者会弹出列表的最后一个元素。但是popitem弹出随机项。

  • setdefault
    setdefault方法在某种程度上类似于get方法,能够获得与给定键相关联的值,除此之外,setdefault还能在字典中不含有给定键的情况下设定相应的键值。

  • update
    update方法可以利用一个字典项更新另一个字典:

>>> people = {

    'Alice': {
        'phone': '2341',
        'addr': 'Foo drive 23'
    },

    'Beth': {
        'phone': '9102',
        'addr': 'Bar street 42'
    },

    'Cecil': {
        'phone': '3158',
        'addr': 'Baz avenue 90'
    }

}

>>> x = {  'Alice': {
        'phone': '5551',
        'addr': 'Foo 23'
    }}

>>> people.update(x)
>>> people
{

   'Alice': {
        'phone': '5551',
        'addr': 'Foo 23'
    },

    'Beth': {
        'phone': '9102',
        'addr': 'Bar street 42'
    },

    'Cecil': {
        'phone': '3158',
        'addr': 'Baz avenue 90'
    }

}
  • values和itervalues
    values方法以列表的形式返回字典中的值(itervalues返回值的迭代器)。与返回键的列表不同的是,返回值的列表中可以包含重复的元素。

小结

映射
利用字典格式化字符串
字典的方法

你可能感兴趣的:(字典:当索引不好用时)