(二) python 数据结构(字典及练习)

 

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

转载于:https://my.oschina.net/yuanhaohao/blog/2994723

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值