分类: Python

python 排序 sort和sorted的区别,使用和坑

python sort和sorted的区别,使用和坑

sort和sorted区别:

(本文根据B站up主码农高天的视屏整理)

sort跟sorted都是python自带的排序函数,两者的使用方法基本一致。
最大的区别是sort会改变原有列表,而sorted不会改变原有列表并且会返回一个新列表。

sort 和sorted的使用:

a = [1,25,2,5,4,3,6]
b = sorted(a)
print(a)
print(b)
a.sort()
print(a)

打印结果如下,sort改变了原有列表,而sorted没有

我们在使用sort和sorted的时候可以搭配匿名函数使用,这种方法使用的频率较高,一定要掌握

# lst[lst] with sort
a = [[‘xueling’,0],[‘yujie’,2],[‘aitty’,1],[‘xls’,2]]
a.sort(key=lambda x:x[1],reverse=True)
print(a)
# 通过匿名函数来指定key,实现对lst中第二项进行排序

运行结果: [[‘yujie’, 2], [‘xls’, 2], [‘aitty’, 1], [‘xueling’, 0]]

往高处延伸

有时候我们会遇到两次排序的问题:
1,先根据数的次数进行排序
2,当数字相同时根据数的大小从大到小进行排序

我们可以这样写:

b = [2,3,3,2,3,1,4]
b = sorted(b,key=lambda x:(b.count(x),x),reverse=True)
print(b)

运行结果:[3, 3, 3, 2, 2, 4, 1]

sort 的坑

当然,我们也可以用sort来写

b.sort(key=lambda x:(b.count(x),-x))
print(b)

运行结果:[4, 3, 3, 3, 2, 2, 1]
我们发现使用sort运行的结果是错误的,这其实是sort本身编写的问题,涉及底层的架构,所以我们在写sort发现错误的时候,可以尝试把它改写成sorted来判断是不是我们代码本身的错误,sorted是不会错的。

这种错误,其实只会在sort二次排序时才会出现,像key=lambda x:x[1]这样的是不会出现排序错误的。
sort的这种错误,可以说是python的一个bug吧。

Python 正则表达式匹配中文

# 测试匹配中文信息
def TestReChinese( ):
source = u” 数据结构模版—-单链表SimpleLinkList[带头结点&&面向对象设计思想](C语言实现)”
temp = source.decode(‘utf8’)
print “同时匹配中文英文”
print “————————–”
xx = u”([\w\W\u4e00-\u9fff]+)”
pattern = re.compile(xx)
results = pattern.findall(temp)
for result in results:
print result
print “————————–”
print
print
print “只匹配中文”
print “————————–”
xx = u”([\u4e00-\u9fff]+)”
pattern = re.compile(xx)
results = pattern.findall(temp)

for result in results:
print result
print “————————–”

if __name__ == “__main__” :
# 测试正则表达式

reload(sys)
sys.setdefaultencoding(“utf-8”)

TestReChinese( )

python scrapy 安装 使用 配置pipeline、item、settings,浅谈scrapy去重机制,Python:Scrapy传入自定义参数运行,yield meta 方法传递参数 ,Python中requests的会话保持session详解

scrapy startproject 项目名
cd 项目名, # 进入项目,此目录是创建爬虫项目时通过模板自动生成。
scrapy genspider 文件名 域名

MongoDB python scrapy保存到元数据库 navicat

模糊搜索查找
{title: {$regex:/00|jk/}}

忽略转义大小写等模糊查找 {title: {$regex:/hd/,$options:”imsx”}}
{$or:[{title: {$regex:/hd/,$options:”imsx”}} ,{description: {$regex:/jk/,$options:”imsx”}} ]}

多条件or或者查找
{ $or : [{“title” : /.*波多.*/i}, {“description” : /.*jk.*/i}] }

时间范围内
({“START_TIME”:{“$gte”:ISODate(“2021-08-03 07:59:06″),”$lte”:ISODate(“2021-09-01 08:30:46”)}})

复合条件查找
关系数据库:select * from where(state1=11 and state2=22) or value >300
MongoDB数据库:db.getCollection(‘testOrAnd’). find(
{$or:[{$and:[{“state1”:11},{“state2”:22}]},{“value”:{$gte:300}} ] }
)

准确查询
db.user.find({$or:[{name:{$eq:’小博’}},{name:{$eq:’测试小博’}}]})

$exists:查询是否存在某个字段
因为mongodb是非关系型数据库,因此,每条记录可能包含的字段都不一样,不同的数据之间可能存在一些字段没有写入值,想要筛选某个字段是否存在的时候,就可以使用$exists去进行筛选。
存在
db.getCollection(“user”).find({age:{$exists:1}})
db.getCollection(“user”).find({age:{$exists:true}})
不存在
db.getCollection(“user”).find({age:{$exists:0}})
db.getCollection(“user”).find({age:{$exists:false}})

参考链接:https://huaweicloud.csdn.net/63356eadd3efff3090b56b38.html

$regex操作符的介绍
MongoDB使用$regex操作符来设置匹配字符串的正则表达式,使用 PCRE(Pert Compatible Regular Expression)作为正则表达式语言。
regex操作符
{:{$regex:/pattern/,$options:’’}}
{:{$regex:’pattern’,$options:’’}}
{:{$regex:/pattern/}}
正则表达式对象
{: /pattern/}
$regex与正则表达式对象的区别:
在$in操作符中只能使用正则表达式对象,例如:{name:{$in:[/^joe/i,/^jack/}}
在使用隐式的$and操作符中,只能使用$regex,例如:{name:{$regex:/^jo/i, $nin:[‘john’]}}
当option选项中包含X或S选项时,只能使用$regex,例如:{name:{$regex:/m.*line/,$options:”si”}}

$regex操作符的使用
$regex操作符中的option选项可以改变正则匹配的默认行为,它包括 i, m, x以及S四个选项,其含义如下
i 忽略大小写,{{$regex/pattern/i}},设置i选项后,模式中的字母会进行大小写不敏感匹配。
m 多行匹配模式,{{$regex/pattern/,$options:’m’},m选项会更改^和$元字符的默认行为,分别使用与行的开头和结尾匹配,而不是与输入字符串的开头和结尾匹配。
x 忽略非转义的空白字符,{:{$regex:/pattern/,$options:’m’},设置x选项后,正则表达式中的非转义的空白字符将被忽略,同时井号(#)被解释为注释的开头注,只能显式位于option选项中。
s 单行匹配模式{:{$regex:/pattern/,$options:’s’},设置s选项后,会改变模式中的点号(.)元字符的默认行为,它会匹配所有字符,包括换行符(\n),只能显式位于option选项中。
使用$regex操作符时,需要注意下面几个问题:
i,m,x,s可以组合使用,例如:{name:{$regex:/j*k/,$options:”si”}}
在设置索弓}的字段上进行正则匹配可以提高查询速度,而且当正则表达式使用的是前缀表达式时,查询速度会进一步提高,例如:{name:{$regex: /^joe/}

最全的Python虚拟环境使用方法

常用命令

pipenv install:
若项目目录中虚拟环境未创建且无Pipfile文件,将安装虚拟环境并创建Pipfile文件
若项目目录中虚拟环境未创建且有Pipfile文件,将根据Pipfile文件来安装相应python版本和依赖包
若项目目录中虚拟环境已创建且有Pipfile文件,将根据Pipfile文件来安装依赖包

pipenv install xx::安装python包
pipenv uninstall xx::卸载python包
pipenv shell:进入虚拟环境(项目目录下)
exit:退出虚拟环境
pipenv graph:显示包依赖关系
pipenv –venv:显示虚拟环境安装路径

1. 使用pip
pip install virtualenv
2. 创建运行环境
virtualenv [虚拟环境名称]
virtualenv venv

#如果不想使用系统的包,加上–no-site-packeages参数
virtualenv –no-site-packages 创建路径名
3. 激活环境
linux:

$ cd venv
$ source ./bin/activate
Windows 10:

> cd venv
> .\Scripts\activate.bat
4. 退出环境
linux:

$ deactivate

Windows 10:

> .\Scripts\deactivate.bat

5. 删除环境
没有使用virtualenvwrapper前,可以直接删除venv文件夹来删除环境

6. 使用环境
进入环境后,一切操作和正常使用python一样 安装包使用pip install 包