前言
Python 是一门非常优美的语言,并且功能也非常强大。本文搜集并总结了一些 Python 常用的技巧,一方面自己巩固知识点,另一方面也可以给正在 Python 这条道路的同胞们一些指导。
话不多说,直接进入主题。
正文
交换变量值
快速交换两个变量的值,操作非常简单,示例如下:
a = 1b = 2print('before : a =',a,'b=',b)a,b = b,aprint('after : a =',a,'b=',b)
输出:
before : a = 1 b= 2after : a = 2 b= 1
合并列表中的所有元素
将一个列表中的所有元素合并起来,示例如下:
a = ["Python","is","good"]print(' '.join(a))
输出:
Python is good
这里使用空格来隔开每一个元素。
查找列表中出现频率最高的元素
在一个列表中,统计出重复最多的元素,并计算其重复次数,示例如下:
a = [1,2,3,3,4,5,6,1,2,7,2,9,1,2]print(max(set(a),key = a.count))from collections import Countercnt = Counter(a)print(cnt.most_common())
输出:
2[(2, 4), (1, 3), (3, 2), (4, 1), (5, 1), (6, 1), (7, 1), (9, 1)]
第一个打印,输出的是列表中出现的频率最高的元素
第二个打印,输出的是列表中每个元素出现的频率,用元组的形式表示。
其中第一个输出
print(max(set(a),key = a.count))
也可以写成:
print(max(set(a),key = lambda x:a.count(x)))
这样其实更便于理解。
关于 max 的用法可以参考这里。
关于 set 的用法可以参考这里
而第二个输出:
print(cnt.most_common())
这里的most_common可以指定参数,假如说传入cnt.most_common(2),那么将返回排前2个的集合,如果不指定参数,默认输出所有。
关于Counter的用法可以参考这里。
返回列表中最小值和最大值的索引
a = [21,34,56,32,2,45]def find_max_value_index(a):return max(range(len(a)),key = a.__getitem__)def find_min_value_index(a):return min(range(len(a)),key = lambda x: a[x])print(find_max_value_index(a))print(find_min_value_index(a))
注意,这里定义了两个函数,分别计算最大值和最小值的索引值。两种写法有些不同,一个是使用了关键字lambda,我个人更倾向于添加lambda关键字的这种,利于理解。
为了更容易理解上面的这种写法, 这里把语句拆解开并打印出来,这样就一目了然了;
print(len(a))print(range(len(a)))print(a.__getitem__(0))
输出:
6range(0, 6)21
检查两个字符串是不是由相同字母不同顺序组合
from collections import Countera = 'awawa211eqsass'b = 'wadqw1'c = 'abcde'd = 'cdabe'print(Counter(a) == Counter(b))print(Counter(c) == Counter(d))
输出:
FalseTrue
反转字符串
a = 'awawa211eqsass'f = a[::-1] print(f) #ssasqe112awawa
也可以使用循环,不过是分行输出
for x in reversed(a):print(x)
如果是要翻转一个很长的数字
aa = 12345678print(int(str(aa)[::-1])) #87654321
反转列表
类似上面的反转字符串
bb = [1,2,3,4,5]print(bb[::-1]) #[5,4,3,2,1]
同样可以通过循环的方式来
for x in reversed(bb):print(x)
移除列表中的重复元素
>>> a = [1,2,3,4,5,3,2,1,7]>>> print(list(set(a)))[1, 2, 3, 4, 5, 7]
还可以导入库中的模块来实现
>>> b = ['aaw','bbb','ccc','aaw']>>> print(list(set(b)))['aaw', 'ccc', 'bbb']>>> from collections import OrderedDict>>> print(list(OrderedDict.fromkeys(b).keys()))['aaw', 'bbb', 'ccc']
合并字典
a = {'a':1}b = {'b':2}#方法一print({**a,**b})#方法二print(dict(a.items() | b.items()))#方法三a.update(b)print(a)
输出结果:
{'a': 1, 'b': 2}{'b': 2, 'a': 1}{'a': 1, 'b': 2}
for else 用法
for x in range(1,5):if x == 0:breakelse:print("did not break out of for loop")
输出:
did not break out of for loop
这个用法的意思就是,当循环结束后但是 for 中的内容还没有执行,就会执行 else 中的内容。
转换列表为逗号分隔符形式
#纯字符串列表a = ['aaa','bbb','ccc']print(','.join(a))#纯数字列表b = [1,2,3,4]print(','.join(map(str,b)))#字符串加数字列表c = [1,2,'aaa',4]print(','.join(map(str,c)))
输出:
aaa,bbb,ccc1,2,3,41,2,aaa,4
字典 get 的方法
a = {'aaa':10,'bbb':20,'ccc':30}print(a.get("ddd",23))
可以传入默认值,如果查询不到 key 的话,就会返回默认值。
通过「键」排序字典元素
a = {'bbb':50,'aaa':20,'ccc':30}print(sorted(a.items(),key=lambda x:x[1]))#------测试-------#print(a.items())print(('bbb', 50)[1])
输出:
[('aaa', 20), ('ccc', 30), ('bbb', 50)]dict_items([('bbb', 50), ('aaa', 20), ('ccc', 30)])50
为了便于理解,这里输出了 items()的值。
a = {'bbb':50,'aaa':20,'ccc':30}#方法一print(sorted(a.items(),key=lambda x:x[1]))#方法二from operator import itemgetterprint(sorted(a.items(),key = itemgetter(1)))print(sorted(a,key=a.get))
输出:
[('aaa', 20), ('ccc', 30), ('bbb', 50)][('aaa', 20), ('ccc', 30), ('bbb', 50)]['aaa', 'ccc', 'bbb']
其中最后一句输出的是排序后的 key 列表。
转置二维数组
org = [['a','b'],['c','d'],['e','f']]tran = zip(*org)print(list(tran))
输出:
[('a', 'c', 'e'), ('b', 'd', 'f')]
链式函数调用
这是一种比较新颖的写法,可以大大的缩短精简代码:
def add(a,b):return a+bdef sub(a,b):return a-bb = Trueprint((add if b else sub)(3,2))
输出为:5
链式比较
a = 5print(1< a < 8)print(1 == a < 20)
输出为:
TrueFalse
列表拷贝的几种方式
直接看示例吧
#仅赋值a = [1,2,3,4]b = ab[0] = 5print(a,b)#深拷贝a = [1,2,3,4]b = a[:]b[0] =10print(a,b)#相当于重新创建一个list空间a = [1,2,3,4]b = list(a)b[0] = 6print(a,b)#使用 list的copy函数,只有 Python3支持a = [1,2,3,4]b = a.copy()b[0] = 8print(a,b)#导入包来实现深拷贝from copy import deepcopyb = [[1,2],[3,4]]c = deepcopy(b)c[0][0] = 5print(b,c)
输出结果:
[5, 2, 3, 4] [5, 2, 3, 4][1, 2, 3, 4] [10, 2, 3, 4][1, 2, 3, 4] [6, 2, 3, 4][1, 2, 3, 4] [8, 2, 3, 4][[1, 2], [3, 4]] [[5, 2], [3, 4]]
可以看到, 第一种方式仅仅是将 list 赋值给另一个对象,并非开辟新的空间,其他几种方式都属于深拷贝。
参考文档:
/a6591753290361340429/?tt_from=android_share&utm_campaign=client_share×tamp=1535293192&app=news_article&iid=41720269988&utm_medium=toutiao_android&group_id=6591753290361340429