库
一些可能用到的内置库
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 使用;
杂乱技巧
一些碰到的奇怪的技巧
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])
逆序切片
python的切片操作list[begin_idx: end_idx: step]
无论step为正或者负,则输出从begin到end前一位
begin_idx和end_idx建议直接从正向去数就好了,没必要从-1开始
特殊情况:输出反转列表 list[::-1]
进制转化
原理:先将读入的字符串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