Python常用技巧了解一下?

版权声明: https://blog.csdn.net/luoyayun361/article/details/82286777

前言

Python 是一门非常优美的语言,并且功能也非常强大。本文搜集并总结了一些 Python 常用的技巧,一方面自己巩固知识点,另一方面也可以给正在 Python 这条道路的同胞们一些指导。

话不多说,直接进入主题。

正文

交换变量值

快速交换两个变量的值,操作非常简单,示例如下:

a = 1
b = 2
print('before : a =',a,'b=',b)
a,b = b,a
print('after : a =',a,'b=',b)

输出:

before : a = 1 b= 2
after : 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 Counter

cnt = 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))

输出:

6
range(0, 6)
21

检查两个字符串是不是由相同字母不同顺序组合

from collections import Counter

a = 'awawa211eqsass'
b = 'wadqw1'

c = 'abcde'
d = 'cdabe'
print(Counter(a) == Counter(b))
print(Counter(c) == Counter(d))

输出:

False
True

反转字符串

a = 'awawa211eqsass'
f = a[::-1]  
print(f)    #ssasqe112awawa

也可以使用循环,不过是分行输出

for x in reversed(a):
    print(x)

如果是要翻转一个很长的数字

aa = 12345678
print(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:
        break
else:
    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,ccc
1,2,3,4
1,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 itemgetter
print(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+b
def sub(a,b):
    return a-b

b = True
print((add if b else sub)(3,2))

输出为:5

链式比较

a = 5
print(1< a < 8)
print(1 == a < 20)

输出为:

True
False

列表拷贝的几种方式

直接看示例吧

#仅赋值
a = [1,2,3,4]
b = a
b[0] = 5
print(a,b)

#深拷贝
a = [1,2,3,4]
b = a[:]
b[0] =10
print(a,b)

#相当于重新创建一个list空间
a = [1,2,3,4]
b = list(a)
b[0] = 6
print(a,b)

#使用 list的copy函数,只有 Python3支持
a = [1,2,3,4]
b = a.copy()
b[0] = 8
print(a,b)

#导入包来实现深拷贝
from copy import deepcopy
b = [[1,2],[3,4]]
c = deepcopy(b)
c[0][0] = 5
print(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 赋值给另一个对象,并非开辟新的空间,其他几种方式都属于深拷贝。

参考文档:
https://www.toutiao.com/a6591753290361340429/?tt_from=android_share&utm_campaign=client_share&timestamp=1535293192&app=news_article&iid=41720269988&utm_medium=toutiao_android&group_id=6591753290361340429

猜你喜欢

转载自blog.csdn.net/luoyayun361/article/details/82286777