python常用函数
处理输入:
牛客:
import sys
line = sys.stdin.readline().spilt()
nums = list(map(int, line.split()))
赛码:
n = int(input())
nums = list(map(int, input().split()))
# line = sys.stdin.readline().strip('\n')
# nums = list(map(int, line.split()))
如果使用sys.stdin.readline,因为默认会带换行符,所以要strip('\n')进行截取;
使用input()则不会。
内置函数
random()
a=["1","2","3"]
print(random.choice(a)), 随机返回列表a中的一个元素
print(random.sample(a,2)), 随机返回列表a中的两个元素
print(random.randint(0,9)),随机返回0-9中的一个整数
print(random.uniform(0,9)),随机返回0-9中的一个浮点数
round()
四舍五入
print(round(4.6))
range()
从后往前遍历到0:
for i in range(length - 1, -1, -1):
先列再行:
dp = [[0]*(len2 + 1) for _ in range(len1 + 1)]
dp = [[0 for _ in range(len2 + 1)] for _ in range(len1 + 1)]
digit
digits 是标准库 string 下的一个字符串常量,即 '0123456789'
print(digits[:0:-1])
print(digits[::-1])
# 987654321
# 9876543210
sort()与sorted()
nums = [2,6,3,8,4]
string = 'sdfggsma'
str_list = ['abc','abcd','abca']
print(sorted(nums)) # 不改变原数组顺序,需要赋值给一个新变量
print(nums)
nums.sort() # 改变原数组顺序
print(nums)
print(sorted(str_list)) # 均可以对字符数组排序
print(str_list)
str_list.sort()
print(str_list)
print(sorted(string)) # 可以对字符排序
# string.sort() # 不可以对字符排序
# print(string)
输出结果:
[2, 3, 4, 6, 8]
[2, 6, 3, 8, 4]
[2, 3, 4, 6, 8]
['abc', 'abca', 'abcd']
['abc', 'abcd', 'abca']
['abc', 'abca', 'abcd']
['a', 'd', 'f', 'g', 'g', 'm', 's', 's']
stones = sorted(zip(rocks, capacity), key=lambda x: (x[1] - x[0])) # 自定义排序函数
stockPrices.sort(key=lambda x: x[0]) # 二维数组按照第0列排序
# 先按第一列降序,再按第二列升序排列
people.sort(key = lambda x:(-x[0],x[1]))
# 将nums按绝对值从大到小排列,两种方法都可以
nums = sorted(nums, key = abs, reverse = True)
nums.sort(key = abs,reverse = True)
sum()
对数组求和
left_count = sum(1 for i in range(lo, hi + 1) if nums[i] == left)
sum_ = sum(nums)
decimal.Decimal()
高精度(默认28位,可调更高)
import decimal
斜率 = decimal.Decimal(y1-y0)/decimal.Decimal(x1-x0)
6076. 表示一个折线图的最少线段数
zip()
for x, y in zip(capacity, rocks)
split()
通过指定分隔符对字符串进行切片,如果第二个参数 num 有指定值,则分割为 num+1 个子字符串。
默认会将字符串用空白或者换行符分割,并且返回一个列表
注意:字符串中间无论有多少个空格,它都会按一个空白进行分割。
s = '1 2 3 4 5 6'
a = s.split(' ')
# 输出:['1', '2', '3', '4', '5', '', '', '', '6']
strip()
默认将字符串首部与尾部的空白去掉,但不会去除字符串中间的空格,返回一个字符串
s = ' 1 2 3 4 5 6'
b = s.strip()
# 输出:'1 2 3 4 5 6'
replace()
str1 = "www.w3cschool.cc"
print ("菜鸟教程旧地址:", str1)
print ("菜鸟教程新地址:", str1.replace("w3cschool.cc", "runoob.com"))
str2 = "this is string example....wow!!!"
print (str2.replace("s", "a", 2))
输出:
Counter()
from collections import Counter
类似于hashmap计算数组中每个元素出现的次数
AABBBC -> {'A':2,'B':3,'C':1}
与dict()数据的区别是Counter()函数默认没有key的value为0
6083. 判断一个数的数字计数是否等于数位的值
class Solution:
def digitCount(self, num: str) -> bool:
cnter = Counter(num)
for i in range(len(num)):
if cnter[str(i)] != int(num[i]):
return False
return True
class Solution:
def leastInterval(self, tasks: List[str], n: int) -> int:
dict_freq = list(collections.Counter(tasks).values()) # 所有任务的出现次数, AABBBC -> [2,3,1]
max_freq = max(dict_freq) # 最多的执行次数
max_num = dict_freq.count(max_freq) # 具有最多执行次数的任务数量
return max((max_freq - 1) * (n + 1) + max_num, len(tasks))
class Solution:
def totalFruit(self, fruits: List[int]) -> int:
left, right, res = 0, 0, 0
dic = Counter()
while right < len(fruits):
dic[fruits[right]] += 1
while len(dic) > 2:
dic[fruits[left]] -= 1
if dic[fruits[left]] == 0:
del dic[fruits[left]]
left += 1
right += 1
res = max(res, right - left)
return res
Counter()函数可以直接相减
若ransomNote中的字符在magazine没有出现则会返回Counter({'a': 1})
否则返回Counter(),即为空的
class Solution:
def canConstruct(self, ransomNote: str, magazine: str) -> bool:
if len(ransomNote) > len(magazine):
return False
return not Counter(ransomNote) - Counter(magazine)
451. 根据字符出现频率排序
根据Counter得到的字典value进行排序
class Solution:
def frequencySort(self, s: str) -> str:
cnt = Counter(s)
res = ''
for c, v in sorted(list(cnt.items()), key = lambda x:-x[1]):
res += c * v
return res
count()
string = 'banana pie banana'
string.count('a',2)
输出:5
enumerate()
class Solution:
def largestWordCount(self, messages: List[str], senders: List[str]) -> str:
# 统计每个sender的发送量
cnt = defaultdict(int)
for i,mes in enumerate(messages):
cnt[senders[i]]+=len(mes.split(' '))
tmp = []
# 找到发出信息最多的人(可以有多个)
maximum = max(cnt.values())
for k,v in cnt.items():
if v == maximum:
tmp.append(k)
# 字典序排序找到最大的
tmp.sort(reverse=True)
return tmp[0]
isdigit()、isdecimal()、isnumeric()
都可以用来判断字符或字符串是否是数字
num = "1" #unicode
num.isdigit() # True
num.isdecimal() # True
num.isnumeric() # True
num = "1" # 全角
num.isdigit() # True
num.isdecimal() # True
num.isnumeric() # True
num = b"1" # byte
num.isdigit() # True
num.isdecimal() # AttributeError 'bytes' object has no attribute 'isdecimal'
num.isnumeric() # AttributeError 'bytes' object has no attribute 'isnumeric'
num = "IV" # 罗马数字
num.isdigit() # True
num.isdecimal() # False
num.isnumeric() # True
num = "四" # 汉字
num.isdigit() # False
num.isdecimal() # False
num.isnumeric() # True
===================
区别:
isdigit()
True: Unicode数字,byte数字(单字节),全角数字(双字节),罗马数字
False: 汉字数字
Error: 无
isdecimal()
True: Unicode数字,,全角数字(双字节)
False: 罗马数字,汉字数字
Error: byte数字(单字节)
isnumeric()
True: Unicode数字,全角数字(双字节),罗马数字,汉字数字
False: 无
Error: byte数字(单字节)
class Solution:
def discountPrices(self, sentence: str, discount: int) -> str:
s = sentence.split(' ')
for i in range(len(s)):
c = s[i]
# print(c)
if len(c)>1 and c[0]=='$' and all(t.isdigit() for t in c[1:]):
cost = int(c[1:])
newc = '$'+f'{cost*(1-discount/100):.2f}'
# print(newc,"----")
s[i]=newc
return ' '.join(s)
class Solution:
def discountPrices(self, sentence: str, discount: int) -> str:
l = sentence.split(' ')
r = []
for x in l:
if x[0] == '$' and x[1:].isnumeric():
i = int(x[1:]) * (100 - discount)
r.append('$%d.%02d' % (i // 100, i % 100))
else:
r.append(x)
return ' '.join(r)
pairwise()
判断两个相邻的字符是否相同
for s, t in pairwise(password):
if s == t:
return False
ord()
取字符的ASCII值
for i in range(len(s)):
hash_[ord(s[i]) - ord('a')] = i
0 ~ 9:48~57
A ~ Z:65~90
a ~ z:97~122
chr()
ASCII码转字符
print(chr(64))
title()、upper()、lower()
str1 = "aBcd efg"
str2 = str1.title() # 首字母大写
str3 = str1.upper() # 全转成大写
str4 = str1.lower() # 全转成小写
print(str2)
print(str3)
print(str4)
输出:
Python 中常用处理字符串的相关函数
(1)string.capitalize() 把字符串的第一个字符大写
(2)string.count(str, beg=0, end=len(string)) 返回 str 在 string 里面出现的次数,如果 beg 或者 end 指定则返回指定范围内 str 出现的次数
(3)string.endswith(obj, beg=0, end=len(string)) 检查字符串是否以 obj 结束,如果beg 或者 end 指定则检查指定的范围内是否以 obj 结束,如果是,返回 True,否则返回 False.
(4)string.find(str, beg=0, end=len(string)) 检测 str 是否包含在 string 中,如果 beg 和 end 指定范围,则检查是否包含在指定范围内,如果是返回开始的索引值,否则返回-1
(5)string.index(str, beg=0, end=len(string)) 跟find()方法一样,只不过如果str不在 string中会报一个异常.
(6)string.isalnum() 如果 string 至少有一个字符并且所有字符都是字母或数字则返回 True,否则返回 False
(7)string.isalpha() 如果 string 至少有一个字符并且所有字符都是字母则返回 True,否则返回 False
(8)string.isdecimal() 如果 string 只包含十进制数字则返回 True 否则返回 False.
(9)string.isdigit() 如果 string 只包含数字则返回 True 否则返回 False.
(10)string.islower() 如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是小写,则返回 True,否则返回 False
(11)string.isnumeric() 如果 string 中只包含数字字符,则返回 True,否则返回 False
(12)string.isspace() 如果 string 中只包含空格,则返回 True,否则返回 False.
(13)string.istitle() 如果 string 是标题化的(见 title())则返回 True,否则返回 False
(14)string.isupper() 如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是大写,则返回 True,否则返回 False
(15)string.join(seq) 以 string 作为分隔符,将 seq 中所有的元素(的字符串表示)合并为一个新的字符串
(16)string.lower() 转换 string 中所有大写字符为小写.
(17)string.lstrip() 截掉 string 左边的空格
(18)max(str) 返回字符串 str 中最大的字母。
(19)min(str) 返回字符串 str 中最小的字母。
(20)string.replace(str1, str2, num=string.count(str1)) 把 string 中的 str1 替换成 str2,如果 num 指定,则替换不超过 num 次.
(21)string.split(str="", num=string.count(str)) 以 str 为分隔符切片 string,如果 num 有指定值,则仅分隔 num+ 个子字符串
(22)string.startswith(obj, beg=0,end=len(string)) 检查字符串是否是以 obj 开头,是则返回 True,否则返回 False。如果beg 和 end 指定值,则在指定范围内检查.
(23)string.strip([obj]) 在 string 上执行 lstrip()和 rstrip()
(24)string.swapcase() 翻转 string 中的大小写
(25)string.title() 返回"标题化"的 string,就是说所有单词都是以大写开始,其余字母均为小写(见 istitle())
(26)string.translate(str, del="") 根据 str 给出的表(包含 256 个字符)转换 string 的字符,要过滤掉的字符放到 del 参数中
(27)string.upper() 转换 string 中的小写字母为大写
注:
islower()判断时如果里面有中文或其他符号仍然返回True
因此需要使用encode()先进行编码
s.encode('utf-8').isalpha() and s.islower()
参考资料:
python-小知识点 --- 判断字母大小写和数字字符串,特殊符号
iloc() ilx() loc()
制表符\t与换行符\n
message1 = "hello python"
message2 = "hello\tpython"
message3 = "hello\npython"
print(message1)
print(message2)
print(message3)
输出:
pow()
pow(x, y[, z])
函数是计算 x 的 y 次方,如果 z 在存在,则再对结果进行取模,其结果等效于 pow(x,y) %z。
注意:pow() 通过内置的方法直接调用,内置方法会把参数作为整型,而 math 模块则会把参数转换为 float。
gcd()
求两个数的最大公因数
cur = gcd(cur, nums[j])
lcm()
求两个数的最小公倍数
l = lcm(l,nums[j])
eval()
用来执行一个字符串表达式,并返回表达式的值。
注意:计算指定表达式的值。也就是说它要执行的python代码只能是单个表达式(注意eval不支持任何形式的赋值操作),而不能是复杂的代码逻辑。
语法:eval(expression[, globals[, locals]])
参数:
expression -- 表达式。
globals -- 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。
locals -- 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。
例如:
x = 3
eval( '5 * x' )
# 返回15
注意:eval()还可将字符串转成字典
exdata='{"name":"xiaoli","sex":"1"}'
print(eval(exdata))
# 返回 {'name': 'xiaoli', 'sex': '1'}
求集合的交、并、差
print(list(set(a).intersection(set(b)))) # 求交集
print(list(set(a).union(set(b)) # 求并集
print(list(set(b).difference(set(a)))) # 求差集
参考资料:
Python中 isdigit() 和 isnumeric() 的区别
Python 基础API
菜鸟教程
【Python】内置函数eval的用法(及str转为dict的三种方式:eval/json/exec)