python-字典集合

初始化

下面的方法都是等价的

d={'a':1, 'b':2, 'c':3}
d
=dict({'a':1, 'b':2, 'c':3})
d
= dict([('a',1), ('b', 2), ('c', 3)]) d = dict(a=1, b=2, c=3) d = dict(zip(['a', 'b', 'c'], [1,2,3]))#这个方法也可以用作将两个列表合并成一个字典

s1 = {1, 2, 3}
s2 = set([1, 2, 3])

赋值

  • e = d #引用赋值,e、d始终是一样的
  • e = d.copy() #值赋值,二者是没有关联的
  • d.copy()是一个浅拷贝,当键值对的值遇到字典或者列表时,字典或列表还会随着原来的变化而变化,此时的值相当于元组或列表的引用或指针,而不是其本身,指向的元组或列表其实还是原来的。使用copy模块的deepcopy()方法可以避免这种情况。
import copy

dict1 = {'a': [1, 2], 'b': 3}
dict2 = dict1
dict3 = dict1.copy()
dict4 = copy.deepcopy(dict1)

dict1['b'] = 'change'
dict1['a'].append('change')

print dict1  # {'a': [1, 2, 'change'], 'b': 'change'}
print dict2  # {'a': [1, 2, 'change'], 'b': 'change'}
print dict3  # {'a': [1, 2, 'change'], 'b': 3}
print dict4  # {'a': [1, 2], 'b': 3}

增加元素

d['d'] = 4#直接通过索引下标添加,如果该键值已存在,那就是修改元素了,当然也可以访问元素

删除元素

  • d.clear()#删除d中的所有元素
  • d.pop('a')#删除键值为‘a’的元素
  • del d['a']#删除键值为‘a’的元素

查询

访问元素

字典访问可以直接索引键,如果不存在,就会抛出异常:

d = {'name': 'jason', 'age': 20}
d['name']
'jason'
d['location']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'location'

也可以使用 get(key, default) 函数来进行索引。如果键不存在,调用 get() 函数可以返回一个默认值。比如下面这个示例,返回了'null'。

d = {'name': 'jason', 'age': 20}
d.get('name')
'jason'
d.get('location', 'null')
'null'

 

集合并不支持索引操作,因为集合本质上是一个哈希表,和列表不一样。所以,下面这样的操作是错误的,Python 会抛出异常:

s = {1, 2, 3}
s[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'set' object does not support indexing

想要判断一个元素在不在字典或集合内,我们可以用 value in dict/set 来判断。

s = {1, 2, 3}
1 in s
True
10 in s
False

d = {'name': 'jason', 'age': 20}
'name' in d
True
'location' in d
False

遍历元素

for k in d:
  print 'd[%s]=' % k,d[k]

for k,v in d.items():
  print 'd[%s]=' % k,v

for k,v in d.iteritems():
  print 'd[%s]=' % k,v

for k,v in d.viewitems():
  print 'd[%s]=' % k,v

items(),iteritems()和viewitems()区别

参考地址:http://www.jb51.net/article/54116.htm

python2.x的 items() 就是返回一个像上面那样的包含dict所有元素的list,但是由于这样太浪费内存,所以后来就加入了(注:在Python 2.2开始出现的)iteritems(), iterkeys(), itervalues()这一组函数,用于返回一个 iterator 来节省内存,但是迭代器不能反映dict在调用这个函数之后的变化。所以就添加了viewitems(),始终代表最新的元素。Python3.x中只有一个items函数,这个函数与2.x中的viewitems()等价。

 

参考链接:http://www.tuicool.com/articles/rAzQfq

字典合并

  • dd = dict(dict1.items() + dict2.items())

但是这种效率不高,通过上面的分析指导,它实际上是调用items先返回对应的列表,然后执行列表相加,最后再按照列表初始化成字典的形式进行初始化

  • dd = dict(dict1, **dict2)

字典的键必须是字符串。在Python 2(解释器是CPython)中,我们可以使用非字符串作为键,但别被蒙骗了:这种hack只是凑巧在使用标准CPython运行环境的Python 2中才有效。

上面语句相当于

dd = dict1.copy()
dd.update(dict2)

其中的dd.update(dict2)又相当于

for k in dict2
  dd[k] = dict2[k]

可知update的作用不仅可以添加不存在的元素,还能修改已存在的键的元素值。

并且通过上面知道通过update和for...in也是可以合并字典的。

排序

#调用sorted()排序
dict = {"a" : "apple", "b" : "grape", "c" : "orange", "d" : "banana"}
print dict
#按照key排序
print sorted(dict.items(), key=lambda d: d[0])
#按照value排序
print sorted(dict.items(), key=lambda d: d[1])

ls = list(dict.keys())
ls.sort()
for k in ls:
    print(k, dict[k])

for k in sorted(dict.keys()):
   print(k, dict[k])

 

posted on 2017-02-28 14:46  simple_孙  阅读(8751)  评论(0编辑  收藏  举报

导航