当前位置:网站首页>JSON的Unicode问题;自定义排序问题;保留最大子集问题
JSON的Unicode问题;自定义排序问题;保留最大子集问题
2022-08-08 11:31:00 【tslilove】
今日话题就是给大家分享4个Python解决实际问题的小Demo如下:
解决JSON的Unicode问题
解决自定义排序问题
解决保留最大子集问题
解决列表为转换字符串
温馨提示:都是干货哦!看完记得收藏哦!
1、解决JSON的Unicode问题
获取某APP影片素材的时候,出现中文Unicode编码,部分如下:

例如框选的部分就是unicode编码,在字典中,我们如何将其解码呢?
在如下核心代码中的,先通过json.dumps将字典序列化为JSON字符串,然后编码weiutf8,再解码unicode_escape,最后再利用json.loads反序列化为JSON对象,有一个小Tips是data[1:-1],这个不是固定的,根据需要实时更改即可
data = unquote(resq.json()['data'])
print(f"解码前:{data}")
data = unquote(resq.json()['data'])
data = json.dumps(data).encode('utf-8').decode('unicode_escape')
data = json.loads(data[1:-1])
print(f"解码后:{data}")

2、解决自定义排序问题
例如我有这样一个需求,将数组 ["你", "爱", "我"] 按照 ["我","是","真","的","爱","你"] 这种目标数组样式排序,也就是说,目标数组是固定的,我们需要排序的数组是目标数组的子集,即集合AB
例:
#导入随机模块
import random
def selfDefinedSort(a: list, b: list) -> list:
"""
自定义排序
:param a: 需排序数组
:param b: 目标数组
:return:
"""
c = {}
sorted(c)
d = []
for i in a:
if i in b:
c[b.index(i)] = i
for k in sorted(c):
d.append(c.get(k))
return d
if __name__ == '__main__':
b = ["我", "是", "真", "的", "爱", "你"]
num = random.randint(1,len(b))
#构造b的子集
a = list(set([random.choice(b) for _ in range(num)]))
print(f"原数组为:",a)
print(f"排序结果为:",selfDefinedSort(a,b))

我们将原来的两个循环分别利用字典式和列表式来完成,是不是简洁很多
优化代码:
#!/usr/bin/python
# -*- coding:utf-8 -*-
# @Time :2022/7/1 15:05
# @Author : 亮哥
# @微信公众号 : 亮哥数据实验室
# Software : PyCharm
def selfDefinedSort(a: list, b: list) -> list:
"""
自定义排序
:param a: 需排序数组
:param b: 目标数组
:return:
"""
#字典式
c = {b.index(i):i for i in a if i in b}
sorted(c)
#列表式
d = [c[k] for k in c]
return d
if __name__ == '__main__':
b = ["我", "是", "真", "的", "爱", "你"]
num = random.randint(1,len(b))
a = list(set([random.choice(b) for _ in range(num)]))
print(f"原数组为:",a)
print(f"排序结果为:",selfDefinedSort(a,b))
3、解决保留最大子集问题
例如我有这样一个需求,数组 ["我","的","我是真的爱你","我的","是"], 我最终保留的是元素的最大子集,即 ['我是真的爱你', '我的']
这里解释一下[x for x in a if not any(x in j for j in a if x != j)] 这行代码
意思就是说,循环列表a,利用any方法判断,有一个为真返回True,否则返回False,然后在循环a,判断外层元素x是否在元素j,当然(x!=j)排除本身,如果有x在任意一个元素里面,则any这里返回True,接着外层判断 if not 取反,则为False,就不存入数组,反之存入数组
#!/usr/bin/python
# -*- coding:utf-8 -*-
# @Time :2022/7/1 15:05
# @Author : 亮哥
# @微信公众号 : 亮哥数据实验室
# Software : PyCharm
def deleteRepeatAndSubElement(a: list) -> list:
"""
删除重复的、一个字的
:param a: 需要处理列表
:return: 返回已处理列表
"""
if a:
#先将原数组去重
a = list(set(a))
#any方法就是说只有有一个为真,就为真
b = [x for x in a if not any(x in j for j in a if x != j)]
#按照元素长度降序,reverse=Fasle为升序
b.sort(key=lambda x: len(x), reverse=True)
return b
else:
return a
if __name__ == '__main__':
a = ["我","的","我是真的爱你","我的","是"]
print(deleteRepeatAndSubElement(a))

4、解决列表为转换字符串
例如将a = ["张三","李四","王五","赵六"]转换为字符串为 "张三李四王五赵六"该如何做呢?
利用join方法即可,默认是无空格拼接,有的小伙伴会疑问,去重我们不是可以利用set么,是的没错,但是set会默认按照字符排序,不能达到一定的目的,这里利用字典保证其顺序,高效
#!/usr/bin/python
# -*- coding:utf-8 -*-
# @Time :2022/7/1 15:05
# @Author : 亮哥
# @微信公众号 : 亮哥数据实验室
# Software : PyCharm
def mergeArray(a:list,sep:str)->str:
"""
合并匹配词
:param a: 匹配词列表
:return: 返回匹配词字符串,以逗号分隔
"""
#去重
a = [j for j in {i: 1 for i in a}]
return f"{sep}".join(a)
if __name__ == '__main__':
a = ["张三","李四","王五","赵六","张三"]
sep = ""
print(mergeArray(a,sep))
那我们想要用其他符号进行分隔怎么办呢?
例如用逗号分隔或者分号分隔,你只需将上述代码中的sep赋值为 ","或";"即可

这里有第一点需要注意:利用join方法的时候,需要每个元素是字符串,否则会报错
例如:a = ["张三","李四","王五","赵六","张三",1]

那怎么办呢?
只需要将去重那一步的元素转化为字符串即可


边栏推荐
- 测试开发专栏——序言:总结过去,展望未来
- Postman使用简单演示
- E121: Unable to open and write file solution when vim /etc/profile is written
- day02 -DOM - advanced events (register events, event listeners, delete events, DOM event flow, event objects, prevent default behavior, prevent event bubbling, event delegation) - commonly used mouse
- .NET Community Toolkit 8.0.0 版本发布
- day01 -Web API介绍—DOM 介绍—获取元素—事件基础—操作元素—排他操作—自定义属性操作—节点操作—案例:动态生成表格—创建元素的三种方式(经典面试题)
- MySQL Dual-Master 双向同步
- 五、树结构
- MySQL----索引
- 报错 | Cannot find module ‘@better-scroll/core/dist/types/BScroll‘
猜你喜欢

ets声明式ui开发,怎么获取当前系统时间

报错 | RegExp2 is not defined

软件测试之测试代表用户

dedecms支持Word图文自动粘贴

shell之常用小工具

Combining "xPlus" to discuss the innovation and change of software architecture

京东云无线宝产品部负责人张晓东 : 京东云无线宝与开源的亲密关系 | 《大神详解开源 BUFF 增益攻略》讲座回顾...

模式识别 学习笔记:第八章 特征提取

300万招标!青岛市医疗保障局主机数据库中间件运行维护服务项目

#yyds Dry Goods Inventory#【Yugong Series】August 2022 Go Teaching Course 005-Variable
随机推荐
部署spark2.2集群(standalone模式)
LeetCode每日一题--有序队列(整理最小表示法)
在半小时内从无到有开发并调试一款Chrome扩展(Chrome插件/谷歌浏览器插件)
Study Notes: CS520 Knowledge Graphs
Replication监控及自动故障切换
2G 3G 4G 5G 基站覆盖范围
ReentrantReadWriteLock读写锁和票据锁StempedLock
MySQL----索引
day02 -DOM—高级事件(注册事件、事件监听、删除事件、DOM事件流、事件对象、阻止默认行为、阻止事件冒泡、事件委托)—常用鼠标事件—常用的键盘事件
使用ApacheBench来对美多商城的秒杀功能进行高并发压力测试
萤石、小米对垒智能摄像头
Hystrix熔断器
【地平线旭日X3派试用体验】WIFI连接,SSH登录,TogetherROS安装(第二节)
【C语言】[编程题]倒置字符串
LeetCode_1004_最大连续1的个数Ⅲ
LeetCode_487_最大连续1的个数Ⅱ
Mysql索引优化实战
SCCM2012R2管理之版本更新
Kubernetes资源编排系列之四: CRD+Operator篇
Optional常用方法解析