当索引行不通时

字典是Python中唯一的内置映射类型,其中的值不按顺序排列,而是存储在键下。键可能是数、字符串或元组。
Python字典的一些用途:

  1. 表示棋盘的状态,其中每个键都是由坐标组成的元组;
  2. 存储文件修改时间,其中的键为文件名;
  3. 数字电话/地址簿
>>> phonebook={'Alice':'2341','Beth':'9102','Cecil':'3258'}
>>> phonebook['Cecil']
'3258'

字典由键及其对应的值组成,这种键-值对称为项。
可使用函数dict从其他映射(如其他字典)或键-值对序列创建字典。

>>> items=[('name','Gumby'),('age',42)]
>>> d=dict(items)
>>> d
{'name': 'Gumby', 'age': 42}
还可以使用关键字参数来调用dict函数
>>> d=dict(name='Gumby',age=42)
>>> d
{'name': 'Gumby', 'age': 42}
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=input('Name:')
request=input('Phone number(p) or address(a)?')
if request=='P':key='phone'
if request=='a':key='addr'
if name in people:
    print("{}'s {} is {}.".format(name,labels[key],people[name][key]))

python for in加索引 python里索引_python


方法clear删除所有的字典项。

>>> d={}
>>> d['name']='Gumby'
>>> d['age']=42
>>> d
{'name': 'Gumby', 'age': 42}
>>> returned_value=d.clear()
>>> d
{}
>>>print(returned_value)
None

方法copy返回一个新字典,其包含的键-值对与原来的字典相同

>>> x={'username':'admin','machines':['foo','bar','baz']}
>>> y=x.copy()
>>>
>>> y['username']='mlh'
>>> y['machines'].remove('bar')
>>> y
{'username': 'mlh', 'machines': ['foo', 'baz']}
>>> x
{'username': 'admin', 'machines': ['foo', 'baz']}

当替换副本中的值时,原件不受影响。然而,如果修改副本中的值(就地修改而不是替换),原件也将发生变化。为了避免这种问题,一种办法是执行深复制,即同时复制值及其包含的所有值。

>>> from copy import deepcopy
>>> d={}
>>> d['name']=['Alfred','Bertrand']
>>> c=d.copy()
>>> dc=deepcopy(d)
>>> d['name'].append('Clive')
>>> c
{'name': ['Alfred', 'Bertrand', 'Clive']}
>>> dc
{'name': ['Alfred', 'Bertrand']}

方法fromkeys创建一个新字典,其中包含指定的键,且每个键对应的值都是None。

>>> {}.fromkeys(['name','age'])
{'name': None, 'age': None}
不用先创建一个新字典,在对其调用方法fromkeys来创建另一个字典,可以直接对dict调用方法fromkeys,因为dict是所有字典所属的类型。
>>> dict.fromkeys(['name','age'],'(unknown)')
{'name': '(unknown)', 'age': '(unknown)'}

方法get为访问字典项提供了宽松的环境。当在字典中没有找到就不会报错,只会返回默认值None,或者自己定义返回值。

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=input('Name:')
request=input('Phone number(p) or address(a)?')
key=request
if request=='p':key='phone'
if request=='a':key='addr'
person=people.get(name,{})
label=labels.get(key,key)
result=person.get(key,'not available')
print("{}'s {} is {}.".format(name,label,result))

python for in加索引 python里索引_Web_02


方法items返回一个包含所有字典项的列表,其中每个元素都为(key,value)的形式。

>>> d={'title':'Python Web Site','url':'http://www.python.org','spam':0}
>>> d.items()
dict_items([('title', 'Python Web Site'), ('url', 'http://www.python.org'), ('sp
am', 0)])

方法keys返回一个字典视图,其中包含指定字典中的键。
方法pop可用于获取与指定键相关联的值,并将该键-值对从字典中删除。

>>> d={'x':1,'y':2}
>>> d.pop('x')
1
>>> d
{'y': 2}

方法popitem类似于list.pop,但list.pop弹出列表中的最后一个元素,而popitem随机地弹出一个字典项,因为字典项的顺序是不确定的。

>>> d={'url':'http://www.python.org','spam':0,'title':'Python Web Site'}
>>> d.popitem()
('title', 'Python Web Site')
>>> d
{'url': 'http://www.python.org', 'spam': 0}

方法setdefault有点像get,但是他除了获取与指定键相关联的值之外,setdefault还在字典不包含指定的键时,在字典中添加指定 的键-值对。

>>> d={}
>>> d.setdefault('name','N/A')
'N/A'
>>> d
{'name': 'N/A'}
>>> d['name']='Gumby'
>>> d.setdefault('name','N/A')
'Gumby'
>>> d
{'name': 'Gumby'}

方法update使用一个字典中的项来更新另一个字典。

>>> d={
...     'title':'Python Web Site',
...     'url':'http://www.python.org',
...     'changed':'Mar 14 22:09:15 MET 2016'
...    }
>>> x={'title':'Python Language Website'}
>>> d.update(x)
>>> d
{'title': 'Python Language Website', 'url': 'http://www.python.org', 'changed':
'Mar 14 22:09:15 MET 2016'}

方法values返回一个由字典中的值组成的字典视图。不同于方法keys,方法values返回的视图可能包含重复的值。

>>> d={}
>>> d[1]=1
>>> d[2]=2
>>> d[3]=3
>>> d[4]=1
>>> d.values()
dict_values([1, 2, 3, 1])