python之字典、字典追加

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值