目录
1、统计列表中元素的频率:
可以直接使用collections的Counter进行统计,不必自己手动去编写
from collections import Counter
test_list = [1,1,2,2,3,3,3,4,5,5]
print(Counter(test_list))
print(type(Counter(test_list)))
Counter({3: 3, 1: 2, 2: 2, 5: 2, 4: 1})
<class 'collections.Counter'>
用法二,在统计完成的基础上,想获取列表中最常见的元素(众数)
print(Counter(test_list).most_common(2))
利用most_common直接获取,而且里面传入参数,表示你需要获取几个。
2、判断字符串所包含元素是否相同
Counter函数可以用来去判断字符串中元素个数是否相同,注意,这里不包含顺序,举例来说,用这种方式apple和leapp会被判定为相同
from collections import Counter
str1="qwe"
str2="weq"
str3="eqw"
cn_str1,cn_str2,cn_str3 = Counter(str1),Counter(str2),Counter(str3)
if cn_str1==cn_str2 and cn_str3==cn_str2:
print("三个字符串元素相同")
3、将数字字符串转换为数字列表
其实就是map函数的一个用法,把int函数作用域num_str中的每一个元素,得到的结果再转换为list。
#将数字字符串转换为数字列表
num_str="123456"
num_list = list(map(int,num_str))
print(num_list)
4、使用enmuerate获取索引-数值对
这个方法还是用的比较多的,一般使用for循环时,不光要获取元素对象,还想获取对应的索引,可以利用这种方法。
test_list = [1,2,3,4,5]
for (index,num) in enumerate(test_list):
print(index,num)
0 1
1 2
2 3
3 4
4 5
5、获取变量在系统中占用的内存
就sys.getsizeof,不过这个在平时有用吗?没想到应用场景
import sys
str1="a"
str2="apple"
num=32
print(sys.getsizeof(str1))
print(sys.getsizeof(str2))
print(sys.getsizeof(num))
50
54
28
6、随机采样
利用random来实现随机采样,这个也没见人怎么用过...
import random
list1=[1,2,3,4,5,6]
n_samples=3
print(random.sample(list1,n_samples))
7、装饰器
用来把逻辑部分与计时部分分离,提高程序的可读性,将计时部分进行抽离。
很nice,应该是固定写法,把非逻辑部分抽离
#装饰器
import time
#装饰名字
def display_time(func):
def wrapper(*args):
t_start = time.time()
result=func(*args)
t_end = time.time()
print(t_end - t_start)
return result
return wrapper
def is_prime(num):
if num<2:
return False
elif num==2:
return True
else:
for i in range(2,num):
if num%i==0:
return False
return True
@display_time
def count_prime_nums(max_num):
count = 0
for i in range(2,max_num):
if is_prime(i):
print(i)
count+=1
return count
count=count_prime_nums(10000)
print(count)
注意,如果要有返回值的时候,需要在装饰器部分得到函数的返回值,然后在装饰器里面把这个值进行返回。
*args表示不管多少个参数,都传进去
8、在判断字典中有没有一个键时
这个有用,有时候判断字典里有没有这个键的时候,get好像会快点?而且判断None来设置默认值。
my_dic = {"item":"football","price":10.0}
count = my_dic.get("count")
print(count)
if not count:
my_dic.setdefault("count",0)
print(my_dic)
9、判断字符串是否全部是由字母组成
不需要自己去定义,在python中有直接的函数!
my_str.isalpha()
全部由字母组成,返回True
否则返回False
2、对某个可迭代对象(字典、列表、元组等)进行多步排序
多步排序,举个例子,先按照内容来排序,如果内容一样再按照ID排序
听起来很简单,但是实现起来也确实有技巧:
my_test = ["b:7","a:7","c:4","d:3"]
def f(log):
id_, rest = log.split(":", 1)
return (rest,id_)
print(sorted(my_test, key=f))
比如上面的例子,先按照字符串的值排序,再按照字符串的id排序,可以得到下面的结果:
['d:3', 'c:4', 'a:7', 'b:7']
在leetcode有一个很类似的题目,需要利用这种功能:地址为https://leetcode-cn.com/problems/reorder-data-in-log-files/
10、列表不能作为字典的键!但是元组可以
也有时候需要用字典来统计一个列表中相同的元素的个数,但是可能元素也是一种列表,这种时候就不能直接使用collections.Counter来统计,需要把原列表的元素转为tuple!
11、经常使用的位运算
技巧一:使用位运算获取二进制最右边的1
x&(-x)
解释:使用x&(-x)可以获取到二进制最右边的1,图解如下:
注意:-x的计算实际上是x的反码(各位取反)后末尾加一
通过使用x&(-x)可以获取到原本x中的二进制最后一位1
技巧二:消去x中二进制最右边的1
x&(x-1)
图解:
应用场景:用来判断一个数字是不是2的幂:力扣