1、字典:是python里面的数据结构,字典的对象value是可变的,但是字典的键值key是不可变的,一个字典可以使用不同类型的键值(元组);不能使用列表list,因为列表是可变的, 因为字典是hash 表显示是无序的;
可用来存储一个人年龄 身高 性别等;
当然字符串也可以存储的,但是如果有的姓名不是3个,那就取得不全的;
info = 'tom 180 man'
info[0:3]
'tom'
当然也可以存储元组里,但是元组一旦定义完之后,里面的元素就不能更改,那么如果增加联系人 等信息就无法添加了; read only
当然也可以存储到列表里, 但是将来取数据也比较麻烦,通过下标来取,不知道索引就无法取了;
如下:先创建一个list1 list2 list3 并用zip函数把他们连接到一起;然后把这些信息放到字典里,然后取就很方便了;
In [298]: list1 = ['name', 'age']
In [300]: list2 = ['tom','20']
In [301]: list3 = ['mike','25']
In [302]: list2
Out[302]: ['tom', '20']
In [303]: zip(list1, list2)
Out[303]: [('name', 'tom'), ('age', '20')]
In [304]: list1
Out[304]: ['name', 'age']
In [305]: list2
Out[305]: ['tom', '20']
In [306]: zip(list1, list3)
Out[306]: [('name', 'mike'), ('age', '25')]
注释:zip函数会把两个列表合并,组成一个大的列表;
注释:列表 [ ] 元组 ( ) 字典 { } 字符串 ' '
字典的方法:
keys() 返回当前字典中所有的keys 值; dic.keys()
values() 返回当前字典中所有的value值; dic.value()
items()
创建字典; dic { }
dic = {'a':1, 1:123} a 表示key 键值 1 表是 value 中间用冒号 : 隔开;
In [307]: dic = {}
In [308]: type(dic)
Out[308]: dict
In [309]: dic = {'a':1, 1:123} #创建两对数据; key - value 对应;
In [310]: dic
Out[310]: {1: 123, 'a': 1}
2、那么用元组()作为key值来创建字典;如下;因为元组()是不可变的,可以用来当做key 键值; dc = {('a','b'):'hello'}
In [313]: dc = {('a','b'):'hello'}
In [314]: type(dc)
Out[314]: dict
In [315]: dc
Out[315]: {('a', 'b'): 'hello'}
3、那么用list[]来作为key 值创建字典,不可以的,因为list是可变的;
In [317]: dc1 = {[1]:1}
------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-317-c906c08b610a> in <module>()
----> 1 dc1 = {[1]:1}
TypeError: unhashable type: 'list'
注释:如上图例,所有list[ ] 不能当做字典的键值 key 来使用;
len(dic) 也可以看字典的长度;
4、字典的参数如下;
dic.key() 返回所有key值组成一个列表list并显示;
In [319]: dic.keys()
Out[319]: ['a', 1, ('a', 'b')]
dic.values() 返回所有value值组成一个列表list并显示;
In [320]: dic.values()
Out[320]: [1, 123, 'hello']
3、字典的相关参数: 通过 help(dic.get) 来查看对应的帮助;
n [22]: dic.
dic.clear() 清空字典内容,只是清空,空字典还在 dic.get(key值) 输出 value
dic.iteritems dic.keys()返回当前字典中所有的keys
dic.setdefault dic.viewitems dic.copy() 复制一个新的字典 dic1 = dic.copy()
dic.has_key(key值) 判断key值是否在dic中,在则true,不在则flase
dic.iterkeys dic.pop(key) 删除这个key对应的value,并显示在屏幕上
dic.update(dic1) 里面跟一个列表,用来把两个字典合并成一个字典 dic.viewkeys
dic.formkeys('abc', 1) 序列 值 可以用来创建字典, 然后显示序列,值如果不写则为 NONE, 使用value 值时一样的字典; dic.items 把字典转换成列表list,里层是元组tuple,方便用切片或者索引;
dic.itervalues dic.popitem dic.values() 返回当前字典中所有的values
dic.viewvalues
dic.clear dic.get(key值) 输出 value dic.iteritems dic.keys dic.setdefault dic.viewitems
dic.copy dic.has_key() dic.iterkeys dic.pop dic.update dic.viewkeys
dic.fromkeys dic.items dic.itervalues dic.popitem dic.values dic.viewvalues
dic.get 通过 help(dic.get)
get(...) k 表示 key 值 D 表示 dic 字典 ;如果key在dic字典里,返回值value ,否则返回none 空;
D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.
In [26]: dic
Out[26]: {1: 123, 'a': 1, ('a', 'b'): 'hello'}
In [27]: dic.get(1)
Out[27]: 123
In [28]: dic.get('a')
Out[28]: 1
In [29]: dic.get('p')
如上,如果返回值不存在,则是none,如果后面添加,则返回后面的值;
In [40]: dic.get('b','linux')
Out[40]: 'linux'
注释:字典里的key 是唯一的,不能冲突;不能改变,当往里面添加时,则会改变 value 值;
In [32]: dic['a']
Out[32]: 1
In [33]: dic['a'] = 3
In [34]: dic
Out[34]: {1: 123, 'a': 3, ('a', 'b'): 'hello'}
注释: 查看字典某个key - value: dic['a'] dic.get('a')
4、判断一个 key 在不在字典里; 在则 返回 ture 不在则返回flase; 方法一:
In [52]: dic
Out[52]: {1: 123, 'a': 3, ('a', 'b'): 'hello'}
In [53]: 'b' in dic
Out[53]: False
In [54]: 'a' in dic
Out[54]: True
In [55]: 1 in dic
Out[55]: True
判断一个key 在不在字典里, 在则 true 不在则flase;
In [57]: dic
Out[57]: {1: 123, 'a': 3, ('a', 'b'): 'hello'}
In [58]: dic.has_key('a')
Out[58]: True
In [59]: dic.has_key('b')
Out[59]: False
In [60]: dic.has_key(1)
Out[60]: True
注释:判断是否在dic 字典中 'key' in dic ===== dic.has_key(key)
5、dic.items() 把字典内容转换成列表 list,最里层是元组 tuple 的形式;这样就可以通过索引和切片的方式来访问里面的值了;
In [70]: dic.items()
Out[70]: [('a', 3), (1, 123), (('a', 'b'), 'hello')]
In [71]: dic
Out[71]: {1: 123, 'a': 3, ('a', 'b'): 'hello'}
6、dic.copy() 用于复制,然后产生一个新的字典; dic1 = dic.copy()
In [71]: dic
Out[71]: {1: 123, 'a': 3, ('a', 'b'): 'hello'}
In [72]: dic1 = dic.copy()
In [73]: dic1
Out[73]: {1: 123, 'a': 3, ('a', 'b'): 'hello'}
7、dic.clear() 清空字典内容,只是清空而已,空字典还在; dic.clear()
In [73]: dic1
Out[73]: {1: 123, 'a': 3, ('a', 'b'): 'hello'}
In [74]: dic1.clear()
In [75]: dic1
Out[75]: {}
8、dic.pop(key) 里面加key值,会删除这个key对应的value,并返回至屏幕上;
In [78]: dic1
Out[78]: {1: 123, 'a': 3, ('a', 'b'): 'hello'}
In [79]: dic1.pop(1)
Out[79]: 123
In [80]: dic1
Out[80]: {'a': 3, ('a', 'b'): 'hello'}
In [81]: dic1.pop(2)
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-81-e47c27be2010> in <module>()
----> 1 dic1.pop(2)
KeyError: 2
In [82]: dic1.pop(2,'abc')
Out[82]: 'abc'
9、dic.update(dic1) 里面跟一个列表,用来把两个字典合并成一个字典;
In [84]: dic
Out[84]: {1: 123, 'a': 3, ('a', 'b'): 'hello'}
In [85]: dic1 = {1:1, 2:2}
In [86]: dic.update(dic1)
In [87]: dic
Out[87]: {1: 1, 2: 2, 'a': 3, ('a', 'b'): 'hello'}
注释:如上dic1是一个字典;
创建字典:
10、dic.formkeys('abc', 1) 序列 值 可以用来创建字典, 然后显示序列,值如果不写则为 NONE, 使用value 值时一样的字典;
In [99]: dic.fromkeys('abc') #只写了序列 key, 不写 值;
Out[99]: {'a': None, 'b': None, 'c': None}
In [101]: dic.fromkeys('abc',100) #写了序列key, 值会都是一样的;
Out[101]: {'a': 100, 'b': 100, 'c': 100}
用range(100) 也可以;
In [102]: dic.fromkeys(range(10),100)
Out[102]:
{0: 100,
1: 100,
2: 100,
3: 100,
4: 100,
5: 100,
6: 100,
7: 100,
8: 100,
9: 100}
创建字典的方法: dic ( [( )] )
In [96]: dict([('name', 'tom'), ('age', '20')]) #可以用这种方法;
Out[96]: {'age': '20', 'name': 'tom'}
In [97]: dict(a=10, b=10) #可以用这种方法;
Out[97]: {'a': 10, 'b': 10}
方法一:
In [119]: dict(x=10,y=10)
Out[119]: {'x': 10, 'y': 10}
方法二:
In [120]: dic = {}
In [121]: dict(x=10,y=10)
Out[121]: {'x': 10, 'y': 10}
方法四:
In [122]: dic = {'a':1, 1:123}
方法三: 可以使可迭代的对象;
In [123]: dict([('a',10),('b',20)])
Out[123]: {'a': 10, 'b': 20}
方法五:
In [124]: dic.fromkeys('abc',100)
Out[124]: {'a': 100, 'b': 100, 'c': 100}
访问字典:
通过打印key 输入 value 来访问; dic[key]
In [126]: dic['a']
Out[126]: 1
通过dic.items() 来返回key value, 打印成 列表的形式; dic.items()
In [127]: dic1.items()
Out[127]: [(1, 1), (2, 2)]
3、也可以通过for循环的方式来访问:
for k in dic: for k in dic:
print k print k, dic[k]
In [129]: for k in dic: #只显示key值;
...: print k
...:
a
1
In [130]: for k in dic: #显示 key 和 value 值对应;
...: print k, dic[k]
...:
a 1
1 123
当然也可以用如下方法: for k in dic: print "%s, %s" % (k, dic[k])
In [137]: dic
Out[137]: {1: 123, 'a': 1}
In [138]: for k in dic:
...: print "%s, %s" % (k, dic[k])
...:
a, 1
1, 123
注释:di = {1:1,3:3,2:2,4:4,5:5}
In [145]: for k, v in di.items():print k,v
1 1
2 2
3 3
4 4
5 5
6、字典练习, 读取键盘的文件:
raw_input 接收的字符串,无论输入什么,都会是字符串;
input 接受的是表达式,可以输入数值,也可以输入字符串(不过需要加单或双引号)
[root@localhost_002 python]# cat 2.py
#!/usr/bin/python
info = {}
name = raw_input("Please input name: ")
age = raw_input("Please input age: ")
gender = raw_input('Please input (M/F): ')
info['name'] = name
info['age'] = age
info['gender'] = gender
print info
#print info.items() 这样则会打印成列表的形式,方便索引和切片;
注释:如果把最后一行修改成 print info.items() 则会打印出一个列表,方便索引和切片;则打印成如下:
[('gender', 'M'), ('age', '24'), ('name', 'yuan')] #列表里面包括了元组tuple 来组成;
运行: python 2.py
[root@localhost_002 python]# python 2.py
Please input name: yuan
Please input age: 24
Please input (M/F): M
{'gender': 'M', 'age': '24', 'name': 'yuan'}
如果用列表的方式打印,就可以用传参的方式来接受key value; 如下:
[('gender', 'M'), ('age', '24'), ('name', 'yuan')]
a, b = ('age', '24') 则 a 等于 age , b 等于 24;
[root@localhost_002 python]# python 2.py
Please input name: yuan
Please input age: 24
Please input (M/F): M
[('gender', 'M'), ('age', '24'), ('name', 'yuan')]
[root@localhost_002 python]# ipython
In [1]: a, b = ('age', '24')
In [2]: a
Out[2]: 'age'
In [3]: b
Out[3]: '24'
In [4]: c,d = ('name', 'yuan')
In [5]: c
Out[5]: 'name'
In [6]: d
Out[6]: 'yuan'
10:当然是序列(列表),就可以使用for 循环来遍历,读取每个元素;如下: 一般print 缩进四个空格即可;
[root@localhost_002 python]# cat 3.py
#!/usr/bin/python
info = {}
name = raw_input("Please input name: ")
age = raw_input("Please input age: ")
gender = raw_input('Please input (M/F): ')
info['name'] = name
info['age'] = age
info['gender'] = gender
for i in info.items():
print i
print "end"
运行:
[root@localhost_002 python]# python 3.py
Please input name: yuan
Please input age: 24
Please input (M/F): M
('gender', 'M')
('age', '24')
('name', 'yuan')
end
注释:只有序列才可以使用 索引 切片 for 循环等;
也可以传递两个参数 k v 来接收这个值: for k, v in info.items(): print k,v
[root@localhost_002 python]# cat 3.py
#!/usr/bin/python
info = {}
name = raw_input("Please input name: ")
age = raw_input("Please input age: ")
gender = raw_input('Please input (M/F): ')
info['name'] = name
info['age'] = age
info['gender'] = gender
for k,v in info.items():
print k,v
print "end"
运行:
[root@localhost_002 python]# python 3.py
Please input name: yuan
Please input age: 24
Please input (M/F): M
gender M
age 24
name yuan
end
当然也可以美化一下,在每一个字符串后面加上: 可以使用拼接符 + : for k,v in info.items(): print k+":",v
[root@localhost_002 python]# cat 5.py
#!/usr/bin/python
info = {}
name = raw_input("Please input name: ")
age = raw_input("Please input age: ")
gender = raw_input("Please input gentder: ")
info['name'] = name
info['age'] = age
info['gender'] = gender
for k,v in info.items():
print k+":",v
# print "%s: %s" % (k, v) 这种方法也可以,这种方法用的更多一些;
print "end"
[root@localhost_002 python]# python 5.py
Please input name: yuan
Please input age: 24
Please input gentder: M
gender: M
age: 24
name: yuan
end
注释#: for k,v in info.items(): print k+":",v 与 for k,v in info.items(): print "%s: %s" % (k,v) 相同:
print "%s: %s" % (k, v) 这种格式化输出的方法用的更多一些;
如果只想求一个元素的话,则就 for k,v in ino,items(): print "%s" %k