Python 是一个解释型语言
简单来说,就是Python文件在执行的时候 基本上 就是 我们的代码被解释器一行行的解释成 计算机能够理解的源码,然后一行行的执行。
但是在解释执行前,Python会对所有的代码进行一次 通篇的语法检查,这个时候就会报出语法错误 (SyntaxError) , 题主的问题就是这样的。 所以当我们看到 SyntaxError 时,应该是最不用担心的时候了,因为 真正需要担心的还没有开始嘛(解释运行时),这时候报的错,都是些小错,语法错误。
字典基本用法:
Python 中的字典是Python中一个键值映射的数据结构,下面介绍一下如何优雅的操作字典.
1.1 创建字典
Python有两种方法可以创建字典,第一种是使用花括号,另一种是使用内建 函数dict
>>> info = {}
>>> info = dict()
1.2 初始化字典
Python可以在创建字典的时候初始化字典
>>> info = {"name" : 'cold'}
>>> info = dict(name = 'cold') # 更优雅
很明显第二种方法更加的优雅和减少一些特殊字符的输入,但是有种情况第二种不能胜任
>>> key = 'name'
>>> info = { key :'cold'} # {'name':'cold'}
>>> info = dict(key = 'cold') # {'key': 'cold'}
明显第二种方法就会引发一个不容易找到的bug
Python字典还有一种初始化方式,就是使用字典的fromkeys方法可以从列表中获取元素作为键并用None或fromkeys方法的第二个参数初始化
>>> info = {}.fromkeys(['name', 'blog'])
>>> info
{'blog': None, 'name': None}
>>> info = dict().fromkeys(['name', 'blog'])
>>> info
{'blog': None, 'name': None}
>>> info = dict().fromkeys(['name', 'blog'], 'linuxzen.com')
>>> info
{'blog': 'linuxzen.com', 'name': 'linuxzen.com'}
1.3 优雅的获取键值
字典可以这样获取到键的值
>>> info = {'name':'cold', 'blog':'linuxzen.com'}
>>> info['name']
'cold'
但是如果获取不存在的键的值就会触发的一个KeyError异常,字典有一个get方法,可以使用字典get方法更加优雅的获取字典
>>> info = dict(name= 'cold', blog='www.linuxzen.com')
>>> info.get('name')
'cold'
>>> info.get('blogname')
None
>>> info.get('blogname', 'linuxzen')
'linuxzen'
我们看到使用get方法获取不存在的键值的时候不会触发异常,同时get方法接收两个参数,当不存在该键的时候就会返回第二个参数的值 我们可以看到使用get更加的优雅
如果字典已知,我们可以任选一个,而当我们不确定字典中是否存在某个键时,我之前的做法如下
if 'age' in a.keys():
print a['age']
因为不先判断的话,直接使用a[‘age’]会导致报错keyerror,提示没有该key的值。
而是用a.get(‘age’) 则不会产生错误,解析器返回值如果存在就返回相应的value, 如果不存在就返回None.
if a.get('age'):
print a['age']
而想要改变value 的值,则需要通过
a[‘name’]=’Jack’
使用a.get(‘name’) = ‘Jack’
编译器则会提示 SyntaxError: can’t assign to function call
1.4 更新/添加
Python 字典可以使用键作为索引来访问/更新/添加值
>>> info = dict()
>>> info['name'] = 'cold'
>>> info['blog'] = 'linuxzen.com'
>>> info
{'blog': 'linuxzen.com', 'name': 'cold'}
>>> info
{'blog': 'linuxzen.com', 'name': 'cold night'}
同时Python字典的update方法也可以更新和添加字典
>>> info = dict(name='cold', blog='linuxzen.com')
>>> info.update({'name':'cold night', 'blogname':'linuxzen'})
>>> info
{'blog': 'linuxzen.com', 'name': 'cold night', 'blogname': 'linuxzen'}
>>> info.update(name='cold', blog='www.linuxzen.com') # 更优雅
>>> info
{'blog': 'www.linuxzen.com', 'name': 'cold', 'blogname': 'linuxzen'}
Python字典的update方法可以使用一个字典来更新字典,也可以使用参数传递类似dict函数一样的方式更新一个字典,上面代码中哦功能的第二个更加优雅,但是同样和dict函数类似,键是变量时也只取字面值
1.5 字典删除
可以调用Python内置关键字del来删除一个键值
>>> info = dict(name='cold', blog='linuxzen.com')
>>> info
{'blog': 'linuxzen.com', 'name': 'cold'}
>>> del info['name']
>>> info
{'blog': 'linuxzen.com'}
同时也可以使用字典的pop方法来取出一个键值,并删除
>>> info = dict(name='cold', blog='linuxzen.com')
>>> info.pop('name')
'cold'
>>> info
{'blog': 'linuxzen.com'}
1.6 遍历
user = {
'first': 'dfe',
'username':'ddd',
'last':'dfe'
}
for key,value in user.items():
print(key + value)
# firstdfe
# usernameddd
# lastdfe
注意:python3.6改写了dict内部算法,3.6的dict是有序的(遍历字典时键值对返回的顺序与存储顺序相同),在此本本之前是无序的
1.7 其他操作
获取所有key
>>> info = dict(name='cold', blog='linuxzen.com')
>>> info.keys()
['blog', 'name']
获取key,value并循环
>>> info = dict(name='cold', blog='linuxzen.com')
>>> for key, value in info.items():
... print key, ':', value
...
blog : linuxzen.com
name : cold
问题:
将列表[1,2,3,4,5,6,7,8,9]中大于5的添加到字典的键为k1中,其余存储到键为k2中
方法
方法1、常规思路
list = [1,2,3,4,5,6,7,8,9] def dictSort(): dict = {} for item in list: if item > 6: if 'k1' in dict.keys(): dict['k1'].append(item) else: dict['k1'] = [item] else: if 'k2' in dict.keys(): dict.get('k2').append(item) # dict.get('k2') = item # can't assign to function call else: dict['k2'] = [item] print(dict) # {'k2': [1, 2, 3, 4, 5, 6], 'k1': [7, 8, 9]} if __name__ == '__main__': dictSort()
注意:1、语法错误: 不能给(can't) 函数(function)调用(call) 赋值(assign) 2、dict['k2'] = item是无错的,实际dict['k2']是一个list
方法3、dict的setdefault()方法
list = [1,2,3,4,5,6,7,8,9]
def dictSort():
dict = {}
for item in list:
if item > 6:
dict.setdefault('k1',[]).append(item)
else:
dict.setdefault('k2', []).append(item)
print(dict) # {'k2': [1, 2, 3, 4, 5, 6], 'k1': [7, 8, 9]}
if __name__ == '__main__':
dictSort()
方法3
使用collections.defaultdict().
# -*- encoding = utf-8 -*-
import collections
all_items = [11, 22, 33, 44, 55, 66, 77, 88, 99]
def defDictSort():
dic = collections.defaultdict(list)
# loop list
for value in all_items:
if value >66:
dic["k1"].append(value)
else:
dic["k2"].append(value)
print(dic)
if __name__ == '__main__':
defDictSort()
输出结果
defaultdict(<class 'list'>, {'k2': [11, 22, 33, 44, 55, 66], 'k1': [77, 88, 99]})
定义字典变量的时候,原来还要指定values的属性,最开始写成了下面这样
dic = collections.defaultdict()
方法4:
使用D.fromkeys()生成一个“默认”的字典。然后根据条件再去追加values.
# -*- encoding = utf-8 -*-
import collections
all_items = [11, 22, 33, 44, 55, 66, 77, 88, 99]
def dictByFromKeys():
dic = {}.fromkeys(("k1", "k2"))
# get values by loop list
for value in all_items:
if value > 66:
if dic["k1"] is None:
dic["k1"] = [value]
else:
dic["k1"].append(value)
else:
if dic["k2"] is None:
dic["k2"] = [value]
else:
dic["k2"].append(value)
print(dic)
if __name__ == '__main__':
dictByFromKeys()
结果输出如下所示:
{'k1': [77, 88, 99], 'k2': [11, 22, 33, 44, 55, 66]}
代码写完调试的时候,fromkeys()默认的value是None,上来拿到list的元素后就直接判断append了,导致报错:NoneType 没有append属性。
然后间接转换了一下,先去判断是否为None,如果是就直接赋值,如果不是,那证明已经有数据加入了,然后再使用append方法就没问题了。
方法5
借助defaultdict跟set,但缺点是,values是无序的。
# -*- encoding = utf-8 -*-
import collections
all_items = [11, 22, 33, 44, 55, 66, 77, 88, 99]
def dictBySet():
dic = collections.defaultdict(set)
# loop list
for value in all_items:
if value > 66:
dic["k1"].add(value)
else:
dic["k2"].add(value)
print(dic)
if __name__ == '__main__':
dictBySet()
输出结果:
defaultdict(<class 'set'>, {'k1': {88, 99, 77}, 'k2': {33, 66, 11, 44, 22, 55}})
方法借鉴:https://blog.csdn.net/huyangshu87/article/details/52681478