更多精彩内容,请关注【力扣简单题】。
计数器
如果我们想统计列表或字符串中每个元素出现的次数,我们可以这样做:
def counter(l):
count_dict = {}
for e in l:
if e in count_dict.keys():
count_dict[e] += 1
else:
count_dict[e] = 1
return count_dict
s = "apple"
c = counter(s)
print(c)
# {'a': 1, 'p': 2, 'l': 1, 'e': 1}
如果我们使用collection模块中的Counter,就可以快速进行统计:
from collections import Counter
s = "apple"
c = Counter(s)
print(c)
# Counter({'p': 2, 'a': 1, 'l': 1, 'e': 1})
列表也是可以统计的。
生成的Counter类可以看做一个字典,相当于字典的继承,支持加减操作,例如:
l1 = [7, 7, 7, 7, 8, 8, 8]
l2 = [7, 7, 7, 8, 8, 8, 8, 9]
c1, c2 = Counter(l1), Counter(l2)
print(c1+c2)
# Counter({7: 7, 8: 7, 9: 1})
print(c1-c2)
# Counter({7: 1})
排列组合
一个箱子里有写着1, 2, 3, 4的四张卡片,从中任意抽两张:
不考虑先后顺序,求所有可能的组合,需要使用combinations;
考虑先后顺序,且无放回的抽取,需要使用permutations;
考虑先后顺序,且有放回的抽取,需要使用product;
实验效果:
from itertools import product, combinations, permutations
nums = [1, 2, 3, 4]
c = combinations(nums, r=2)
a = permutations(nums, r=2)
p = product(nums, repeat=2)
print(list(c))
# [(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]
print(list(a))
# [(1, 2), (1, 3), (1, 4), (2, 1), (2, 3), (2, 4), (3, 1), (3, 2), (3, 4), (4, 1), (4, 2), (4, 3)]
print(list(p))
# [(1, 1), (1, 2), (1, 3), (1, 4), (2, 1), (2, 2), (2, 3), (2, 4), (3, 1), (3, 2), (3, 3), (3, 4), (4, 1), (4, 2), (4, 3), (4, 4)]
数学计算
有时候,我们需要用到数学计算包,例如计算平方,对数等情况,数学计算包可以大大提高我们的编程效率。
from math import log, sqrt, pow
print(log(16, 2))
# 4
print(sqrt(2))
# 1.4142135623730951
print(pow(2, 6))
# 64.0
二分查找
帮助我们使用二分查找法快速定位元素在排序数组中的位置,或应该插入排序数组的位置。
import bisect
print(bisect.bisect_left([1, 2, 3, 4, 5], 2))
# 1
print(bisect.bisect_left([1, 2, 3, 4, 5], 3.5))
# 3
print(bisect.bisect_right([1, 2, 3, 4, 5], 3.5))
# 4
print(bisect.bisect_left([1, 2, 3, 4, 5], 5.5))
# 5
print(bisect.bisect_right([1, 2, 3, 4, 5], 5.5))
# 5
l = [1, 2, 3, 4, 5]
l.insert(bisect.bisect(l, 3.3), 3.3)
print(l)
# [1, 2, 3, 3.3, 4, 5]
灵活使用上述扩展包,会使我们的编码变得高效。
如有疑问或建议,欢迎评论区留言~