python合并两个列表并排序_python合并列表为字典,并排序

昨天为了实现哈夫曼编码

遇到了如何合并两个列表、以及字典排序问题

整理数据

chart = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k']

probability = [0.1, 0.08, 0.14, 0.05, 0.18, 0.03, 0.2, 0.008, 0.135, 0.017, 0.06]

为了后面数据的处理,需要上边的两个列表(字符和它出现的概率),合并为一个字典

node_dict = dict(zip(chart, probability))

通过 zip 函数,两个列表内的元素,一一映射组成元组 (‘a’, 0.1),('b', 0.08)... ...,

通过 dict 函数,转换为字典

{'a': 0.1, 'b': 0.08, 'c': 0.14, 'd': 0.05, 'e': 0.18, 'f': 0.03, 'g': 0.2, 'h': 0.008, 'i': 0.135, 'j': 0.017, 'k': 0.06}

zip 函数得到数据并不能直接使用,可以用 list 函数转为一个元组列表,或者 dict 函数转为字典

字典排序

排序用到的函数就是 sorted 了(sort是列表的方法,字典对象是没有这个方法的,牢记!)

sorted(iterable, /, *, key=None, reverse=False)

sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。

如果直接给它一个字典,会默认按照 "键" 排序;

sort原地排序,sorted 会先复制原来的数据,重新生成一个排序的结果;

默认 reverse = False 按照由小到大排序,需要从大到小,设置 reverse=True即可;

通过键排序

node_dict = sorted(node_dict.items(), key=lambda k: k[0])

node_dict = dict(node_dict)

>>> {'a': 0.1, 'b': 0.08, 'c': 0.14, 'd': 0.05, 'e': 0.18, 'f': 0.03, 'g': 0.2, 'h': 0.008, 'i': 0.135, 'j': 0.017, 'k': 0.06}

通过值排序

node_dict = sorted(node_dict.items(), key=lambda v: v[1])

node_dict = dict(node_dict)

>>> {'h': 0.008, 'j': 0.017, 'f': 0.03, 'd': 0.05, 'k': 0.06, 'b': 0.08, 'a': 0.1, 'i': 0.135, 'c': 0.14, 'e': 0.18, 'g': 0.2}

总结

具体发生了什么呢?

node_dict.items() 获得了一个可以迭代的对象

dict_items([('a', 0.1), ('b', 0.08), ('c', 0.14)... ])

lambda 函数通过表达式 k: k[0] ,先索引 ('a', 0.1) 中的 'a',于是 sorted 开始按照字符的 ASCII 码值开始排序

lambda 函数通过表达式 v: v[1] ,索引了 ('a', 0.1) 中的 0.1,然后 sorted 开始按照数值大小开始排序;

zip,dict, sorted,lambda;

分别实现了列表的合并,字典转化,字典的排序,选取排序的依据

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值