python中if的效率_python:set 真的很效率

​ Python 中,使用集合推导式可以借助列表、元组、字典、集合以及 range 区间,快速生成符合需求的集合。集合推导式的语法格式和字典推导式完全相同,如下所示:

new_set = {i for i in range(10) if i % 2 == 0}

print(new_set)

>>>{0, 2, 4, 6, 8}

有读者可能会问,集合推导式和字典推导式的格式完全相同,那么给定一个类似的推导式,如何判断是哪种推导式呢?最简单直接的方式,就是根据表达式进行判断,如果表达式以键值对(key:value)的形式,则证明此推导式是字典推导式;反之,则是集合推导式。

Python语言中,集合存储的元素无序且不能重复,根据这一特性我们可以很容易的实现去重功能:

new_list = []

old_list = [1, 2, 3, 3, 4, 5]

for i in old_list:

if i not in new_list:

new_list.append(i)

print(new_list)

>>>[1, 2, 3, 4, 5]

用set()去重:

old_list = [1, 2, 3, 3, 4, 5]

new_list = list(set(old_list))

print(new_list)

>>>[1, 2, 3, 4, 5]

只需要将要去重的对象转成集合就轻松的实现了去重,是不是很效率。而且集合的去重效率是高于列表的。

Python语言的集合类型同数学集合类型一样,也有求集合的并集、交集、差集、对称差集运算。这点也是我说集合效率高的原因之一,我们可以利用集合的运算方法来实现数据对比(compare),传统方法是不是要写一大堆的if...else...来判断两组数据是否相等或者包含,下面就拿两个json串的比较来讲解:

json_data_1 = '{"id": "1", "body": {"ext": "qweasd", "code": "0"}}'

json_data_2 = '{"id": "1", "body": {"ext": "qweasd", "code": "1"}}'

上面的json_data_1,json_data_2 看起起来是不是很熟悉,跟字典是不是很像,主要大括号两边的单引号,他的type类型是字符串,不过可以通过json包来将他跟字典进行互转:

import json

json_data_1 = '{"id": "1", "body": {"ext": "qweasd", "code": "0"}}'

dict_data_1 = json.loads(json_data_1)

str_data_1 = json.dumps(dict_data_1)

print(dict_data_1)

print(type(dict_data_1))

print(str_data_1)

print(type(str_data_1))

print(eval(json_data_1))

print(type(eval(json_data_1)))

>>>{'id': '1', 'body': {'ext': 'qweasd', 'code': '0'}}

>>>

>>>{"id": "1", "body": {"ext": "qweasd", "code": "0"}}

>>>

>>>{'id': '1', 'body': {'ext': 'qweasd', 'code': '0'}}

>>>

通过json.loads和json.dumps可以很轻松的实现字典跟json串之间自由的转换,不过在结尾还写有一种方法eval()。eval() 函数是python的内置函数,用来执行一个字符串表达式,并返回表达式的值。eval()的作用也很大,后面再为大家详细说明。上面给出的两个json串里面body还嵌套一层json,在实际工作中我们遇到的数据比这种还要复杂的多,多层嵌套那是常有的事,那我们需要怎样对比这样的数据呢?有句话不是这么说来着“扁平胜于嵌套”,我们可以先将包含嵌套的数据给扁平化处理。如下(处理逻辑省略):

json_data_1 = '{"id": "1", "body.ext": "qweasd", "body.code": "0"}'

json_data_2 = '{"id": "1", "body.ext": "qweasd", "body.code": "1"}'

"""集合化比较"""

import json

json_data_1 = '{"id": "1", "body.ext": "qweasd", "body.code": "0"}'

json_data_2 = '{"id": "1", "body.ext": "qweasd", "body.code": "1"}'

dict_data_1 = json.loads(json_data_1)

dict_data_2 = json.loads(json_data_2)

print(set(dict_data_1.items()) & set(dict_data_2.items())) # 交集

print(set(dict_data_1.items()) ^ set(dict_data_2.items())) # 对称差集

print(set(dict_data_1.items()) - set(dict_data_2.items())) # 差集

>>>{('id', '1'), ('body.ext', 'qweasd')}

>>>{('body.code', '1'), ('body.code', '0')}

>>>{('body.code', '0')}

通过集合的差集很容易就对比出来body.code的值不一样,这里节省了反复的判断过程很快就得出了差异结果,是不是很效率呢。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值