python 类 字典_python-数据类型之字典

Python字典是另一种可变容器模型,且可存储任意类型对象,如字符串、数字、元组等其他容器模型。

一、创建字典

(一)字典的增删改查

(1)字典的创建

key:(不可变类型)数字、字符串、元组

value:任何类型

>>> dict1={}

>>> dict2={'name': 'earth', 'port': 80}

>>> dic1,dict2

({}, {'name': 'earth', 'port': 80})

如果键值是列表,会报错

>>>dict1[[1,2]]={"aa","bbb"}

Traceback (most recent call last):

File "", line 1, in

TypeError: unhashable type: 'list'

键为元组:

>>> dict1[1,2]={"sss","ggg"}

>>> dict1

{(1, 2): set(['ggg', 'sss']), 'name': 'aileen', 'sex': u'\u5973'}

用工厂的方法创建字典:

>>> fdict = dict((['x', 1], ['y', 2]))

>>> fdict

{'y': 2, 'x': 1}

>>> fdict=dict(a=3,b=4) #这个比较常用

>>> fdict

{'a': 3, 'b': 4}

内建方法 fromkeys() 来创建一个"默认"字典:

dict.fromkeys(seq[, value]))

seq -- 字典键值列表。

value -- 可选参数, 设置键序列(seq)的值。

>>> ddict = {}.fromkeys(('x', 'y'), -1)

>>> ddict

{'y': -1, 'x': -1}

>>> edict = {}.fromkeys(('foo', 'bar'))

>>> edict

{'foo': None, 'bar': None}

(2)访问字典的值:字典是无序的所以不能用索引进行访问

>>> dict2 = {'name': 'earth', 'port': 80}

>>> for key in dict2.keys():

... print "key=%s,value=%s"%(key,dict2[key])

key=name,value=earth

key=port,value=80

>>> for key,value in dict2.items():

... print key,value

name earth

port 80

>>> for value in dict2.values():

... print value

earth

80

想访问该字典中的一个数据元素,而它在这个字典中没有对应的键,将会产生一个错误:

>>> dict2["sever"]

Traceback (most recent call last):

File "", line 1, in

KeyError: 'sever'

字典的方法:has_key()和 in 以及 not in 操作符都是布尔类型的。

对于前两者而言,如果字典中有该键就返回真(True),否则返回假(False)。

>>> "sever" in dict2 #dict2.has_key("server")

False

>>> "name" in dict2 #dict2.has_key("name")

True

>>> "earth" in dict2.values()

True

(3)字典的更新

通过以下几种方式对一个字典做修改:添加一个新数据项或新元素(即:一个键-值对);修改一个已存在的数据项;或删除一个已存在的数据项

>>> dict2['name'] = 'venus' #更新已有的条目

>>> dict2['port'] = 6969 #更新已有的条目

>>> dict2['arch'] = 'sunos5' #增加新条目

>>> print "host %(name)s is running on port %(port)d"%dict2

host venus is running on port 6969

注:(1)如果字典中该键已经存在,则字典中该键对应的值将被新值替代。

(2)上面的 print 语句展示了另一种在字典中使用字符串格式符( %)的方法。用字典参数可以简化 print 语句,因为这样做你只须用到一次该字典的名字,而不用在每个元素出现的时候都用元组参数表示。

(4)删除字典元素和字典

>>> del dict2["name"] #删除键为”name”的条目

>>> dict2.clear() #删除dict2中所有的条目

>>> del dict2 #删除整个dict2字典

>>> dict2.pop("name") #删除并返回键为”name”的条目

(二)字典相关函数

(1)dict()-工厂方法

工厂函数被用来创建字典。如果不提供参数,会生成空字典

>>> dict(zip(('x', 'y'), (1, 2)))

{'y': 2, 'x': 1}

>>> dict([['x', 1], ['y', 2]])

{'y': 2, 'x': 1}

>>> dict([('xy'[i-1], i) for i in range(1,3)])

{'y': 2, 'x': 1}

调用 dict()方法可以接受字典或关键字参数字典

>>> dict8=dict(x=1,y=2)

>>> dict8

{'y': 2, 'x': 1}

>>> dict9=dict(**dict8) #只作为了解 dict()方法的用途

>>> dict9

{'y': 2, 'x': 1}

>>> dict9=dict8.copy() #此方法效率更好

>>> dict9

{'y': 2, 'x': 1}

注:copy:dict3、dict2内存不同,改变一个另外一个不变

>>> dict3=dict2.copy()

>>> dict3

{'1': 1, '3': 3, '2': 2}

>>> dict3["1"]=4

>>> dict2

{'1': 1, '3': 3, '2': 2}

>>> id(dict3)

4323369880

>>> id(dict2)

4323370160

>>> id(dict2)

4323370160

引用,修改了一个另一个也改了

>>> dict4=dict2

>>> id(dict4)

4323370160

>>> id(dict2)

4323370160

(2)len()

对字典调用 len(),它会返回所有元素(键-值对)的数目

>>> dict2 = {'name': 'earth', 'port': 80}

>>> len(dict2)

2

(3)hash():

判断某个对象是否可以做一个字典的键,如果非可哈希类型作为参数传递给 hash()方法,会产生TypeError 错误.返回的是返回 obj 的哈希值

>>> hash(3)

3

>>> hash([])

Traceback (most recent call last):

File "", line 1, in

TypeError: unhashable type: 'list'

>>> dict2[{}]="foo"

Traceback (most recent call last):

File "", line 1, in

TypeError: unhashable type: 'dict'

(4)update函数

可以用来将一个字典的内容添加到另外一个字典中,字典中原有的键如果与新添加的键重复,那么重复键所对应的原有条目的值将被新键所对应的值所覆盖。原来不存在的条目则被添加到字典中。

>>> dict2= {'host':'earth', 'port':80}

>>> dict3= {'host':'venus', 'server':'http'}

>>> dict2.update(dict3)

>>> dict2

{'host': 'venus', 'port': 80, 'server': 'http'}

>>> dict2.update({"ip":"192.168.1.1"})

>>> dict2

{'ip': '192.168.1.1', 'host': 'venus', 'port': 80, 'server': 'http'}

(5)get()方法

get方法与键查找(key-lookup)操作符( [ ] )相似,不同的是它允许你为不存在的

键提供默认值。如果该键不存在,也未给出它的默认值,则返回 None。此方法比采用键查找(key-lookup)更灵活,因为你不必担心因键不存在而引发异常。

dict的get方法:

>>> dict2

{'ip': '192.168.1.1', 'host': 'venus', 'port': 80, 'server': 'http'}

>>> dict2.get("host")

'venus'

>>> dict2.get("XXX")

>>> type(dict2.get("XXX"))

>>> dict2.get("XXX","no such key")

'no such key'

(6)Setdefault

检查字典中是否含有某键。 如果字典中这个键存在,你可以取到它的值。 如果所找的键在字典中不存在,你可以给这个键赋默认值并返回此值。

>>> myDict = {'host': 'earth', 'port': 80}

>>> myDict.keys()

['host', 'port']

>>> myDict.items()

[('host', 'earth'), ('port', 80)]

>>> myDict.setdefault("port",8080)

80

>>> myDict.setdefault("pot","tcp")

'tcp'

>>> myDict.items()

[('host', 'earth'), ('port', 80), ('pot', 'tcp')]

(7)Fromkeys(seq,value=None)

创建并返回一个新字典,以 seq 中的元素做该字典的键,val 做该字典中所有键对应的初始值(如果不提供此值,则默认为 None)

>>> {}.fromkeys('xyz')

{'y': None, 'x': None, 'z': None}

>>> {}.fromkeys(('love', 'honor'), True)

{'love': True, 'honor': True}

(8)Sorted()

dic = {'a':31, 'bc':5, 'c':3, 'asd':4, '33':56, 'd':0}

print sorted(dic.iteritems(), key=lambda d:d[0], reverse = False )

按照value 排序:

dic = {'a':31, 'bc':5, 'c':3, 'asd':4, '33':56, 'd':0}

print sorted(dic.iteritems(), key=lambda d:d[1], reverse = False )

可以用以下方法做

>>> d={3:13,2:12,1:21}

>>> sorted_key=sorted(d.keys())

>>> for i in sorted_key:

...     print "%s =%s " %(i,d[i])

(9)dict.iter()

方法 iteritems(), iterkeys(), itervalues()与它们对应的非迭代方法一样,不同的是它们返回一个迭代器,而不是一个列表。

(10)dict.pop(key[, default]) 与popitem函数

方法 get()相似,如果字典中 key 键存在,删除并返回 dict[key],

如果 key 键不存在,且没有给出 default 的值,引发 KeyError 异常。

>>> myDict

{'host': 'earth', 'port': 80, 'pot': 'tcp'}

>>> myDict.pop("host") #pop

'earth'

>>> myDict.pop("hostt","none")

'none'

>>> myDict.pop("hostt")

Traceback (most recent call last):

File "", line 1, in

KeyError: 'hostt'

>>> myDict.popitem() #popitem

('host', 'earth')

>>> myDict.popitem()

('port', 80)

>>> myDict.popitem()

('pot', 'tcp')

>>> myDict.popitem()

Traceback (most recent call last):

File "", line 1, in

KeyError: 'popitem(): dictionary is empty'

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值