AcWing
  • 首页
  • 活动
  • 题库
  • 竞赛
  • 应用
  • 其它
    • 题解
    • 分享
    • 商店
    • 问答
  • 吐槽
  • 登录/注册

奇怪的python技巧

作者: 作者的头像   tornadoH2O ,  2023-01-23 21:19:47 ,  所有人可见 ,  阅读 37


0


库

一些可能用到的内置库

itertools(排列与组合)

itertools模块中全排列函数包含combinations函数和permutations函数

1. combinations函数

函数语法:itertools.combinations(iterable, r)

连续返回由 iterable 元素生成长度为 r 的序列,如果 r 未指定或为 None ,r 默认设置为 iterable的长度,这种情况下生成全长序列,返回的序列中的项按输入iterable中的顺序排序。
42bd7ce80140c8fb1e8020c4b28fb08.png

2. permutations函数

函数语法:itertools.permutations(iterable,r)

iterable是指包含所有元素的列表,r是重新组合元组中的元素个数
如果 r 未指定或为 None ,r 默认设置为 iterable 的长度,这种情况下,生成所有全长排列。

排列元组会以字典顺序根据所输入 iterable 的顺序发出。 因此,如果所输入 iterable 是已排序的,组合元组也将按已排序的顺序生成。即使元素的值相同,不同位置的元素也被认为是不同的。如果元素值都不同,每个排列中的元素值不会重复。

2ed9debb9e6a42a8b0e306d41325cdb.png

注意返回的是元组(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]

进制转化

奇怪的python技巧.jpg
原理:先将读入的字符串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

0 评论

你确定删除吗?
1024
x

© 2018-2023 AcWing 版权所有  |  京ICP备17053197号-1
用户协议  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标
请输入绑定的邮箱地址
请输入注册信息