python编程技巧

目录

1、统计列表中元素的频率:

2、判断字符串所包含元素是否相同

3、将数字字符串转换为数字列表

 4、使用enmuerate获取索引-数值对

5、获取变量在系统中占用的内存

6、随机采样

 7、装饰器

8、在判断字典中有没有一个键时

9、判断字符串是否全部是由字母组成

10、列表不能作为字典的键!但是元组可以

11、经常使用的位运算


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的幂:力扣 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值