最新消息:XAMPP默认安装之后是很不安全的,我们只需要点击左方菜单的 "安全"选项,按照向导操作即可完成安全设置。

超全Python字典及基本操作

XAMPP案例 admin 618浏览 0评论

今天小张帮大家简单介绍下Python的一种数据结构: 字典,字典是 Python 提供的一种常用的数据结构,它用于存放具有映射关系的数据。

比如有份成绩表数据,语文:79,数学:80,英语:92,这组数据看上去像两个列表,但这两个列表的元素之间有一定的关联关系。如果单纯使用两个列表来保存这组数据,则无法记录两组数据之间的关联关系。
为了保存具有映射关系的数据,Python 提供了字典,字典相当于保存了两组数据,其中一组数据是关键数据,被称为 key;另一组数据可通过 key 来访问,被称为 value。形象地看,字典中 key 和 value 的关联关系如图 1 所示:

dre52

由于字典中的 key 是非常关键的数据,而且程序需要通过 key 来访问 value,因此字典中的 key 不允许重复。

一.介绍

1.定义

dict(字典),以{}表示,每一项用逗号隔开, 内部元素用key:value的形式来保存数据,例如

{"jj":"林俊杰", "jay":"周杰伦"}

2.原理

  • 查询的效率非常高, 通过 key 来查找元素
  • 内部使用 key 来计算一个内存地址,采用 hash 算法,并且 key 必须是不可变的数据类型(即为可哈希的数据类型)
  • dict 保存的数据不是按照我们添加进去的顺序保存的. 是按照 hash 表的顺序保存的.而 hash 表不是连续的. 所以没有索引,不能进行切片工作. 它只能通过 key 来获取 dict 中的数据.
dic = {}  # 空字典
dic['徐峥'] = "人在囧途" #直接用key往里面存数据即可
print(dic["徐峥"]) # 最好别这么写,写成   print(dic.get("徐铮")),此时假入没有徐铮,程序也不会报错,会返回None

在这里顺便说下可哈希—-可哈希就是不可变

  • 已知的可哈希(不可变)的数据类型: int, str, tuple, bool
  • 不可哈希(可变)的数据类型: list, dict, set 集合 此三类不能作为 key

二.字典的增、删、改、查

1. 字典的新增:

dic[新key] = "value"   # 如果k存在,会替换原来的value
dic.setdefault("key","value") # 如果key存在,跳过,不存在,则添加

2. 删除

1.pop(key)  #根据key删除    
有返回值,可以写成
value=dic.pop(key)
print(value) # 打印删除的值,但是print(dic)  是整个键值对
2.popitem() # 不写 key 随机删除,(2.x是随机的删除,3.x是删除最后一个字典)
3.clear()  # 清空
4.del dic[key]  # 按照key删除

3. 修改

dic[key] = 新值  # key 为原来的
update()  dic1.update(dic2)  # 将字典2的内容放到1中,如果key1中存在,直接修改value,不存在的话附加到字典1 上

4. 查询

dic = {"徐锦江":"倩女幽魂","苏有朋":"倚天屠龙记"}
1. 用key直接查询
 print(dic["徐锦江"])   #注意,key不存在会报错,此时可以用get,get有返回值
2. dic.get(key)  #没有key返回None
print(dic.get("苏有朋"))   # 倚天屠龙记
3. setdefault()
  print(dic.setdefault("徐锦江"))    #倩女幽魂

5. 其他操作

5.1 get 常用方法

dic={}
print(dic.get("name"))    #None
print(dic.get("name","张三"))   #张三(如果获取为None时,可以自定义默认值)
print(dic)   #{}

dic2={"name":"李四"}
print(dic2.get("name","张三"))   #李四(获取非None时,自定义值不起作用)

5.2 keys()、 values()、 items()的用法

例子:

dic = {"汪峰": "大陆音乐半壁江山", "周杰伦": "亚洲音乐天王", "罗志祥": "亚洲舞王"}
print( dic.keys())
print(dic.values())
print(dic.items())
结果如下:
dict_keys(['汪峰', '周杰伦', '罗志祥'])
dict_values(['大陆音乐半壁江山', '亚洲音乐天王', '亚洲舞王'])
dict_items([('汪峰', '大陆音乐半壁江山'), ('周杰伦', '亚洲音乐天王'), ('罗志祥', '亚洲舞王')])

可执行 这个返回的不是列表, 很像列表,一般不这么用,而是如下操作

  • keys() 获取所有键
for el in dic:
    print(el)   #   直接拿到key value需要字典查一下
    print(dic[el])
  #两者用法一样
for key in dic.keys():
  print(key)   #   取出key
  print(dic[key])  #  取出 value
  • values()获取所有的值
for value in dic.values():
     print(value)      #取出value
  • items() 获取所有的键值对. 返回的是元组
for item in dic.items():
    print(item)
#结果
('汪峰', '大陆音乐半壁江山')
('周杰伦', '亚洲音乐天王')
('罗志祥', '亚洲舞王')
#如果都想拿到 根据解构的思路可以改写成
for k,v in dic.items():
    print(k)    # 取出key       汪峰
    print(v)     # 取出values    大陆音乐半壁江山
    print(k,v)    #      在一排显示 汪峰 大陆音乐半壁江山

5.3 fromkeys 是一个类方法.作用是创建新字典

fromkeys 是一个类方法.作用是创建新字典例

例子1:
d = {}
dd = d.fromkeys(["胡辣汤","are you 确定?"], "周芷若")
print(d) # 原字典没有改变   {}
print(dd) # 新的字典是通过第一个参数的迭代. 和第二个参数组合成key:value创建新字典   {'胡辣汤': '周芷若', 'are you 确定?': '周芷若'}
例子2:
d = dict.fromkeys(["哇哈哈", "爽歪歪"], []) # 所有的key用的都是同一个列表,改变其中一个。另一个也跟着改变
d["哇哈哈"].append("张无忌")
print(d) # {'哇哈哈': ['张无忌'], '爽歪歪': ['张无忌']}

三 小技巧,骚操作

1.合并字典。

  • 方法 1 : 使用 update() 方法,第二个参数合并第一个参数
def Merge(dict1, dict2):
    return(dict2.update(dict1))

# 两个字典
dict1 = {'a': 10, 'b': 8}
dict2 = {'d': 6, 'c': 4}

# 返回  None
print(Merge(dict1, dict2))

# dict2 合并了 dict1
print(dict2)
执行以上代码输出结果为:
None
{'d': 6, 'c': 4, 'a': 10, 'b': 8}
  • 方法 2 : 使用 **,函数将参数以字典的形式导入
def Merge(dict1, dict2):
    res = {**dict1, **dict2}
    return res

# 两个字典
dict1 = {'a': 10, 'b': 8}
dict2 = {'d': 6, 'c': 4}
dict3 = Merge(dict1, dict2)
print(dict3)
执行以上代码输出结果为:
{'a': 10, 'b': 8, 'd': 6, 'c': 4}

2.列表内字典去重

列表的内的元素类型为字符串或这 int 类型的,借助集合 set,会很方便的去重,但是如果元素 dict,此时利用 set 去重将会报错TypeError: unhashable type: ‘dict’,以下介绍一个简单的方法,利用 reduce 简单说下 reduce reduce() 函数会对参数序列中元素进行累积。函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。

  • 语法: reduce(function, iterable[, initializer])
  • 参数 function — 函数,有两个参数 iterable — 可迭代对象 initializer — 可选,初始参数
  • 返回值 返回函数计算结果 具体代码如下:
from functools import reduce
def list_dict_duplicate_removal():
    data_list = [{"a": "123", "b": "321"}, {"a": "123", "b": "321"}, {"b": "321", "a": "123"},{"d":12,"sdf":2312}]
    run_function = lambda x, y: x if y in x else x + [y]
    return reduce(run_function, [[], ] + data_list)

if __name__ == '__main__':
    print (list_dict_duplicate_removal())
#结果如下
[{'a': '123', 'b': '321'}, {'d': 12, 'sdf': 2312}]

 

转载请注明:XAMPP中文组官网 » 超全Python字典及基本操作

您必须 登录 才能发表评论!