![v2-df04ca61a348bd6d6c36bb9d88df3d7d_1440w.jpg?source=172ae18b](http://img-01.proxy.5ce.com/view/image?&type=2&guid=38ae9177-0d30-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-df04ca61a348bd6d6c36bb9d88df3d7d_1440w.jpg?source=172ae18b)
这是一个老外总结的Python的小技巧: https:// hackernoon.com/python-t ricks-101-2836251922e0
主要来自PyTricks: https:// github.com/brennerm/PyT ricks
“Talk is cheap show me the code”,这是编程人条,说半天不如几行代码更有说服力。接下来,我们就用代码说明那些不怎么常见但是非常有用的小技巧。
变量值互换
![v2-d50287f15f435802811ffd84374ef711_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=38ae9177-0d30-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-d50287f15f435802811ffd84374ef711_b.jpg)
这是非常Python范儿(Pythonic)的值交互方法,省去了C、C++中的中间变量
把list的所有元素拼接成一个字符串
![v2-989adf33d4dac838fec4fa44a212bf03_b.png](http://img-01.proxy.5ce.com/view/image?&type=2&guid=38ae9177-0d30-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-989adf33d4dac838fec4fa44a212bf03_b.png)
这个技巧其实就是使用了字符串的join()方法,连接符可以是任意字符串,被join的可以是任意的可迭代对象(iterables),比如:列表、字典、集合、元组等。
找出list中出现频率最高的元素
![v2-ca5b50d32a8adb8f670c04c3302b8965_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=38ae9177-0d30-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-ca5b50d32a8adb8f670c04c3302b8965_b.jpg)
这里给出了两种方法,有兴趣的话,可以测试一下哪种方法更快。
判断两个字符串是否包含相同的字符
![v2-c06f074b8b86e7dbc492364a2190bcae_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=38ae9177-0d30-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-c06f074b8b86e7dbc492364a2190bcae_b.jpg)
其实判断的是两个字符串中字符相同且每个字符出现的次数也相同。
反转字符串
![v2-6434e068b821c82e61e3bc864a3f6365_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=38ae9177-0d30-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-6434e068b821c82e61e3bc864a3f6365_b.jpg)
这里有三种方法,第一种是最常见的,第三种是借用反转字符串的方法来反转整数。
反转列表
![v2-64f8d200e78d3bdf0e9ac7b66ac5b9f7_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=38ae9177-0d30-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-64f8d200e78d3bdf0e9ac7b66ac5b9f7_b.jpg)
这里反转列表的方法,其实跟上面反转字符串的方法是一样的。
转置2D阵列
![v2-381efd6b859f3155bd9dae8c2a5dce5b_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=38ae9177-0d30-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-381efd6b859f3155bd9dae8c2a5dce5b_b.jpg)
这里用到了内置函数zip,zip很强大,可用专门学习一下。
链式比较
![v2-00e488bb5b5a0acb8edaa303819e10e4_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=38ae9177-0d30-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-00e488bb5b5a0acb8edaa303819e10e4_b.jpg)
这就是数学里面的数字比较,比C、C++简便
链式函数调用
![v2-079e7bff7376cd3e72f83611b2bfd6fe_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=38ae9177-0d30-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-079e7bff7376cd3e72f83611b2bfd6fe_b.jpg)
(product if b else add)这个表达式返回的是函数对象,函数对象的调用
列表复制
![v2-5ff1596f35e82fb3bd47a7ad8f867f8a_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=38ae9177-0d30-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-5ff1596f35e82fb3bd47a7ad8f867f8a_b.jpg)
列表的浅拷贝和深拷贝,使用的时候要注意不同场景需要不同的拷贝
字典的get方法
![v2-d6b7cb751f70e9840e314c61531ead73_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=38ae9177-0d30-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-d6b7cb751f70e9840e314c61531ead73_b.jpg)
d.get('c', 3)就是取key为'c'的值,如果不存在该key则默认返回3
按值排序字典
![v2-e6b0a3264c0cccecb3d8b1238c9e3259_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=38ae9177-0d30-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-e6b0a3264c0cccecb3d8b1238c9e3259_b.jpg)
给出了三种方法,都很好的方法,第一种用到了lambda函数
这样也可以的用法:for else
![v2-a3ce2ae12a5a3880b5bcdc6fa84418b2_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=38ae9177-0d30-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-a3ce2ae12a5a3880b5bcdc6fa84418b2_b.jpg)
这个用法很少见,视情况而用。
把列表用符号拼接成字符串
![v2-5acff33a79bb3d829aa5b79f4aa20fc3_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=38ae9177-0d30-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-5acff33a79bb3d829aa5b79f4aa20fc3_b.jpg)
这个跟之前差不多,用到了map把整数转换成字符串
合并字典
![v2-f5273a7eefd27bf57e0eebd267753bc7_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=38ae9177-0d30-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-f5273a7eefd27bf57e0eebd267753bc7_b.jpg)
通常是update方法,前两种很少见
找出列表中最大值或最小值的index
![v2-47c4fb0e400ae6bfa9058a8d55f3cd6f_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=38ae9177-0d30-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-47c4fb0e400ae6bfa9058a8d55f3cd6f_b.jpg)
这个方法也很少见,尤其是用到__getitem__这样的私有方法
去掉列表中重复的元素
![v2-396bdc48e9d8040371baa5a761384e6e_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=38ae9177-0d30-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-396bdc48e9d8040371baa5a761384e6e_b.jpg)
把list转换成set再换回list,这是很经典的列表去重方法
上面这些技巧大多来自github项目PyTricks,不妨去那里看看,以学到更多的Python技巧。