Chinaunix首页 | 论坛 | 博客
  • 博客访问: 58263
  • 博文数量: 13
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 199
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-07 22:11
文章分类

全部博文(13)

文章存档

2014年(13)

我的朋友

分类: Python/Ruby

2014-03-08 23:51:32

字典:通过名字引用值的数据结构,这种数据类型称为映射,字典是python中唯一内建的映射类型。字典中的值没特殊的顺序,但存储在一个特定的键里,键可以是数字,字符串甚至元组

>>> na=['chen','shen','er','xi']

>>> nu=['1234','4567','9874','4561']

>>> na.index('shen')

1---------序号

>>> nu[1]

'4567'

>>> nu[na.index('shen')]

'4567'

 1. 创建和使用字典

例如:hh={‘chen’:’123’,’shen’:’123’}

-------------字典由多个键及对应的值构成的对组成,形如:{键:值}

--------------空字典:{}

dict函数

通过其他映射比如其他字典或者(键,值),这样的序列对建立字典

>>> hh=[('name','chen'),('age',11)]

>>> d=dict(hh)

>>> d

{'age': 11, 'name': 'chen'}

>>> d['name']

'chen'

>>> 

>>> d=dict(name='chen',age=12)--------通过关键字参数创建字典

>>> d

{'age': 12, 'name': 'chen'}

 

  基本字典操作

Len(d)返回d中项(键-值对)的数量

d[k]返回关联到键k上的值

d[k]=v将值v关联到键k

del d[k]删除键为k的项

k in d检查d中是否有含有键为k的项------成员资格(字典比列表更高效),查找的是键,而不是值(区别列表中的v in l查找值,不是索引)

---------

 

>>> d

{'age': 12, 'name': 'chen'}

>>> d['age']

12

>>> len(d)

2

>>> d['name']=shen----------------------注意是字符串

Traceback (most recent call last):

   File "", line 1, in 

     d['name']=shen

NameError: name 'shen' is not defined

>>> d['name']='shen'

>>> d

{'age': 12, 'name': 'shen'}

>>> del d['name']

>>> d

{'age': 12}

>>> 'name' in d

False

  键类型:整形,浮点型,字符串,元组等

  自动添加:一个键期初不存在,分配一个值后字典中就会建立新的项

键可以为任何不可变类型

>>> x=[]

>>> x[42]='chen'-----将字符串关联到空列表42号位置个根本不可能

Traceback (most recent call last):

  File "", line 1, in 

    x[42]='chen'

IndexError: list assignment index out of range

>>> x={}

>>> x[42]='chen'-------字典可以将值可以关联到42键上

>>> x

{42: 'chen'}

>>> x=[None]*43

>>> x[42]='chen'

>>> x--------------------列表必须用None初始化才可以关联元素

[None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, 'chen']

>>> 

电话本例子:

people={

    'alice':{

            'phone':'2341',

            'addr':'foo frice 23'

            },

    'beth':{

            'phone':'9102',

            'addr':'bar street 42'

            },

    'cail':{

            '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's %s is %s."% \

   (name,labels[key],people[name][key]))

        

结果:

>>> 

name: beth

phone number(p) or address(a)?p

beth's phone number is 9102.

>>> 

字典的格式化字符串

>>> ph={'shen':'1234','er':'3456','xi':'7784'}

>>> "xi phone number is %(xi)s."%ph------%后面可加上(),在后面跟上其他说明元素

'xi phone number is 7784.'

转换说明符还是和以前一样,这类字符串格式化在系统模板中非常有用,

例:

>>> template='''

%(title)s

%(title)s

%(text)s

'''

>>> data={'title':'my home page','text':'welcome to my home page!'}

>>> print (template %data)

my home page

my home page

welcome to my home page!

 

字典方法

clear-----清除字典中的项,原地操作,无返回值(None)

>>> d={}

>>> d['name']='chen'

>>> d['age']=23

>>> d

{'name': 'chen', 'age': 23}

>>> hh=d.clear()

>>> d

{}

>>> print (hh)

None

>>> 

情况一:

>>> x={}

>>> y=x

>>> x['key']='value'

>>> y

{'key': 'value'}

>>> x={}

>>> y

{'key': 'value'}-----------x,y最初对应同一字典,将x关联到空字典来对y无影响,相当于创建了y副本,关联着原来的字典,同一字典两个别名,x重新指向后对y无影响

情况二:

>>> x={}

>>> y=x

>>> x['key']='value'

>>> y

{'key': 'value'}

>>> x.clear()

>>> y

{}

>>> -------------clear清空的是字典中的元素亦或数据,而不直接清空别名

 

copy---------返回一个具有相同键-值对的新字典(浅复制,值本身就相同,而不是副本)

 

>>> x={'name':'chen','shen':['tutu','tulu','tmd']}

>>> y=x.copy()

>>> y['name']='er'

>>> y['shen'].remove('tmd')

>>> y

{'name': 'er', 'shen': ['tutu', 'tulu']}

>>> x

{'name': 'chen', 'shen': ['tutu', 'tulu']}

>>> 

-------------------副本替换值,原字典不受影响,如果修改了某个值(删除,原地修改),原字典也会变,同样的值也在原字典中---------用深复制避免此问题

>>> d={}

>>> d['name']=['shen','tulu']

>>> c=d.copy()

>>> dc=deepcopy(d)

>>> d

{'name': ['shen', 'tulu']}

>>> d['name'].append('er')

>>> c

{'name': ['shen', 'tulu', 'er']}

>>> dc

{'name': ['shen', 'tulu']}-----------并未因为增加元素而改变,深复制相当于复制出单独无联系的一份

 

Fromkeys--------------使用给定的键建立新的字典,每个键默认对应的值为None

>>> {}.fromkeys(['name','age'])

{'name': None, 'age': None}

>>> dict.fromkeys(['name','age'],'unknow')

{'name': 'unknow', 'age': 'unknow'}------------可自己指定默认值unknow

>>> 

 

get--------宽松的访问字典项

>>> print(d['name'])

Traceback (most recent call last):

  File "", line 1, in 

    print(d['name'])

KeyError: 'name'-----------------严格要求键不为空

>>> print(d.get('name'))-----------访问不存在的键时,宽松对待,还返回None,键存在时就是普通的字典查询

has_key-----------检查字典中是否含有给出的键,相当于k in d(python 3.0不支持)

Itemsiteritems---------将所有的字典项以列表方法返回,每一项都来自于(键,值),项在返回时并没有特殊的顺序。Iteritems会返回一个迭代器对象。

keysiterkeys---------将字典的键以列表方式返回,而iterkeys返回对象的迭代器,

pop------用来获得对应于给定键的值,然后将该键-值从字典中移除

>>> d={'x':1,'y':2}

>>> d.pop('x')

1

>>> d

{'y': 2}

>>> 

popitem---------类似list.pop----会弹出列表最后一个元素,popitem弹出随机项

>>> d

{'y': 2}

>>> d={'x':1,'y':2,'z':3}

>>> d.popitem()

('y', 2)

>>> d

{'x': 1, 'z': 3}

-----------------字典是无序的

setdefault----------能够获得给定键相关联的值,还能在字典不含给定键的情况下设定相应的键值

>>> d={}

>>> d.setdefault('name','n/a')

'n/a'

>>> d

{'name': 'n/a'}

>>> d['name']='chen'

>>> d.setdefault('name','n/a')

'chen'

>>> d

{'name': 'chen'}

--------------当键不存在时,返回默认值,并更新字典,键存在,就返回相应的值,不改变字典。默认None

update-----------可以利用一个字典项更新另一个字典

>>> d={'name':'shen','ming':'zhiyu','aihao':'gay'}

>>> x={'name':'er'}

>>> d.update(x)

>>> x

{'name': 'er'}

>>> d

{'ming': 'zhiyu', 'name': 'er', 'aihao': 'gay'}

>>> 

------------提供的键会添加到旧字典中,相同的键进行覆盖

valuesitervalues ---------------values以列表形式返回字典的“值”(itervalues返回值的迭代器),返回键的列表不能包含重复元素,返回值的列表可以。

>>> d={}

>>> d[1]=1

>>> d[2]=2

>>> d[3]=3

>>> d[4]=4

>>> d.values()

dict_values([1, 2, 3, 4])

>>> d[5]=4

>>> d.values()

dict_values([1, 2, 3, 4, 4])

 

总结:

字典:{}    格式:{‘x’:’y’}

映射:可以使用任何不可变对象标识元素。常见类型:字符串和元组

阅读(1616) | 评论(2) | 转发(0) |
0

上一篇:没有了

下一篇:linux基础学习-2

给主人留下些什么吧!~~

有经验的网管2014-03-10 22:49:14

啦哆A梦厉害

菜鸟正在努力学习中

回复 | 举报

啦哆A梦2014-03-10 09:42:31

厉害