库
一些可能用到的内置库
itertools(排列与组合)
itertools
模块中全排列函数包含combinations
函数和permutations
函数
1. combinations函数
函数语法:itertools.combinations(iterable, r)
连续返回由 iterable 元素生成长度为 r 的序列,如果 r 未指定或为 None ,r 默认设置为 iterable的长度,这种情况下生成全长序列,返回的序列中的项按输入iterable中的顺序排序。
2. permutations函数
函数语法:itertools.permutations(iterable,r)
iterable是指包含所有元素的列表,r是重新组合元组中的元素个数
如果 r 未指定或为 None ,r 默认设置为 iterable 的长度,这种情况下,生成所有全长排列。
排列元组会以字典顺序根据所输入 iterable 的顺序发出。 因此,如果所输入 iterable 是已排序的,组合元组也将按已排序的顺序生成。即使元素的值相同,不同位置的元素也被认为是不同的。如果元素值都不同,每个排列中的元素值不会重复。
注意返回的是元组(tuple),是不能修改的,可以将其list()后再更改
3. combinations和permutations函数区别
1)combinations方法重点在组合,permutations方法重在排列;
2)combinations和permutations返回的是对象地址,需将iterator转换成list 使用;
杂乱技巧
一些碰到的奇怪的技巧
如何获得数组中最大元素的下标:
采用index()
方法和max()
方法
idx = ls.index(max())
不用循环打印数组
用 *
星号来打印:
a = [1, 2, 3, 4, 5]
# 默认用空格分隔
print(*a)
输出结果:1 2 3 4 5
# 用逗号分隔
print(*a, sep = ", ")
输出结果:1, 2, 3, 4, 5
# 用行分隔
print(*a, sep = "\n")
输出结果:
1
2
3
4
5
Python ASCII码与字符的相互转换
字符转ASCII码:ord('字符')
ASCII码转字符:chr(ASCII码)
python的格式化输出
执行结果:
今天是帅哥的18生日会
今天是18的帅哥生日会
今天是帅哥的18生日会
今天是帅哥的18生日会
今天是帅哥的19生日会,接着上test
python输出浮点数
python中双端队列deque
方法一:
import collections
dq = collections.deque()
方法二:
from collections import deque
deq = deque([0]) #在deq中初始化了0这个元素,也可以不加入
#deq = deque() 像这样
deque
相当于加强版的list
,list
有的操作都有,比如append
,pop
,但也可以对队头操作appendleft(x)
(头部添加元素),popleft()
头部返回并删除。
deque
的速度也比list
快。
python找到字符串中某个字串第一次出现位置
通过find()
方法
找到字符串s中字符串aa
第一次出现的位置: s.find("aa")
如果出现则会返回aa
的的首字母的下标(从0开始)
如果想在指定位置开始查找,只需要再添加一个参数
s.find("aa", 5)
从下标为5的位置开始查找。
如果不存在,则会返回-1
python字符串大小写转换
字符串s
= asDISDsdj
大写转小写:s.lower()
小写转大写:s.upper()
其实在输入的时候就可以一边输入一遍转化大小写,如下
s1 = input().lower()
s2 = input().upper()
python中字典的应用
目前来说,可以用一个数字来对应一堆东西,可以全部放在列表中。
t = c * c + d * d
st[t] = [c, d]
注意当查找字典中的元素时,要用[]
,别用()
,错了找都找不出来。
python的字符串是不能修改的,如果想要修改需要放到list
中进行。
join()
方法
一般用于将数组元素拼接成字符串,前一个’‘表示用什么将元素连接起来,join()
的括号内是列表名。
st = ['e', 'r', 'sa', 'sd']
print(''.join(st)
输出:
ersasd
注意:只支持字符的拼接,如果列表中的元素是int
型的就不可以了,需要挨个转化为str
类型的再拼接。
start = [1, 2, 3, 4, 5, 6, 7, 8]
start = ''.join(str(i) for i in start)
print(start)
输出:
12345678
错误示范:
start_1 = [1, 2, 3, 4, 5, 6, 7, 8]
start_1 = ''.join(str(start_1))
print(start_1)
输出:
[1, 2, 3, 4, 5, 6, 7, 8]
还是列表
in操作在不同数据结构中的应用
- 二分:
nlogn
in
在list
中:O(n)
in
在set
中:O(1)
in
在dict
中:O(1)
所以在做题的时候,如果碰到使用in
来进行查找的,用字典是个很不错的选择捏。
python中的pair数据结构
一般的二元组在C++中会使用pair来存储,在python中,由于list
可以添加各种元素,包括list
与tuple
等,所以可以直接append()
到list
中。
输入:第一行n代表输入的行数,接下来每一行都有两个数字。将两个数字作为一个二元组存储。
7
22 4
2 6
10 3
15 12
9 8
17 17
4 2
p = []
for i in range(n):
a, b = map(int, input().split())
p.append((a, b))
自定义排序(sort)
这里主要针对上面这类二元组的数据结构,一般情况sort
函数会默认对第一个二元组中第一个元素排序,
但也可以写成p.sort(key = lambda x: x[0]
如果要对第二个元素进行排序,则是p.sort(key = lamda x: x[1])
在输入多组数据时,如何读入数据之间的空行?
使用input()
用来读入空行,否则可能会出错。
切片操作
python的切片操作list[begin_idx: end_idx: step]
但需要注意的是end_idx
仍然是终止下标+1
比如a = ABCDEF
,a[0:3] = ABC
无论step为正或者负,则输出从begin
到end
前一位。
begin_idx
和end_idx
建议直接从正向去数就好了,没必要从-1
开始
特殊情况:输出反转列表
l = [0, 1, 2, 3, 4]
如果整个反转:l[::-1]
,结果为:[4, 3, 2, 1, 0]
如果从下标为3的位置(初始为0)开始反转:l[3::-1]
,结果为[3, 2, 1, 0]
in操作的时间复杂度
在列表list
中,in
操作的时间复杂度为O(n)
在字典dict
,集合set
和双端队列deque
中,in
操作的时间复杂度为O(1)
前一个print(i, end = " ")
中有end
,后面继续print(...)
会跟在前一行输出后面(行内),若想换行输出,需要print()
strip()
,lstrip()
,rstrip()
的作用与区别
是 Python 字符串对象的三个方法,它们都可以用来去除字符串的开头或结尾的空格或指定的字符。
strip('指定字符')
:用来去除字符串开头和结尾的指定字符
lstrip('指定字符')
:用来去除字符串开头的指定字符
rstrip('指定字符')
:用来去除字符串结尾的指定字符
如果’指定字符串’是由多个字符组成的,并不是将整个指定字符串看成一个组合,而是删除单个。
比如:
txt = "000%banana,,,,,ssqqqww....."
x = txt.strip(".0%")
print(x)
结果:去掉了原字符串左侧的‘0’和’%’,以及原字符串右侧的’.’。
banana,,,,,ssqqqww
python复制(如果某个数组的初始形态会被使用好几次,如何每次都保证是一个和初始数组一样的数组被操作呢)
导入头文件:
import copy
python的复制分为浅复制和深复制。
二者区别简单来说就是深复制将复制对象完全再复制一遍作为独立的新个体单独存在,而等于赋值,并不会产生一个独立的对象单独存在,他只是将原有的数据块打上一个新标签。
常用的一般就是深复制,这比较重要,等于复制容易造成一切奇奇怪怪的情况。
不如复制一个全新的,和之前完全不搭界的数组。
语法:
import copy
s_new = copy.deepcopy(s_old)
那么s_new
就是个和s_old
完全一样的了
进制转化
原理:先将读入的字符串x进行转换为十进制,再由十进制进行相关的转换。
不管几进制数转换成十进制数 ,都是用 int() 函数 。之后后面的第二个参数写清楚前面字符串 是 几进制数就可以
注意:对于非十进制的数进行转换,都需要先转换到十进制再转化
注意:bin()、oct()、hex()的输入与返回值均为字符串,且分别带有0b、0o、0x前缀。故后面在读取的时候需要舍去前缀
以十六进制转化为例
a = "FF"
# 十六进制转二进制
b = bin(int(a,16))[2:]
# 因为上文提过bin函数带有两位数的前缀,故加上[2:]舍去前缀
print(b) # 11111111
# 十六进制转八进制
b = oct(int(a,16))[2:]
print(b) # 377
# 十六进制转十进制
b = int(a,16)
print(b) # 255
以十进制转化为例,注意这里的int后可以不用加参数
a = "92"
# 十进制转二进制
b = bin(int(a)[2:]
# 加上[2:]从第二位数开始读起
print(b) # 1011100
# 十进制转八进制
b = oct(int(a)[2:]
print(b) # 134
# 十进制转十六进制
b = hex(int(a)[2:]
print(b) # 5c