More pythonic than python!
“人生苦短,我用python”。近日试着用C++ 写了一个R包,一边谷歌,一边写,步履维艰,语法晦涩难懂。转过来,研究一下Python,瞬间舒畅多了。相对于其他语言,Python的语法更加灵活,更加接近自然语言,在其他语言中或许只有一条大路通罗马,在Python中是条条大路通罗马。以下是一些经常遇到的例子,如何写的代码比Python更加Pythonic.
1. 交换变量值
在很多编程语言中,两个变量值的交换通常需要第三个变量作为过渡,但是在Python中,两个变量值可以直接交换,不需要第三者
x,y = 12,13
print(x,y)
# 12 13
x,y = y,x
print(x,y)
# 13 12
2. 合并列表中的元素
在R中合并一个列表(向量)中的元素需要paste
aa = c("This","is","a", "test")
paste(aa, collapse = " ")
# "This is a test"
在Python中不需要paste和collapse,只要join就可以了
aa = ['This','is','a','test']
" ".join(aa)
# 'This is a test'
3. 查找列表中出现频率最高的元素
aa = ["a","b","c","c","c","b"]
max(set(aa), key = lambda x:aa.count(x))
# 'c'
# #set 相当于去重,使用lambda函数对set中的每一个值使用count计数,然后去最大值。
# #这里巧妙使用了lambda函数,再举一例:
# lis = [(1,'a'),(3,'c'), (4,'e'), (-1,'z')]
# max(lis) # 这是max函数会先比较每个元组中第一个元素的大小,如果第一个元素相同,再比较第二个。
# #如果我们想直接比较第二个元素,则可以用
# max(lis, key = lambda x:x[1])
# #(-1, 'z')
如果我们使用collections模块,或许更简单一些
from collections import Counter
aa = ["a","b","c","c","c","b"]
cnt = Counter(aa)
cnt.most_common(2) # 频率最高的前两位
# [('c', 3), ('b', 2)]
4. 逆序字符串
aa = "abcdefg"
aa[::-1]
# 'gfedcba'
# 逆转字符串,返回列表
list(reversed(aa))
# ['g', 'f', 'e', 'd', 'c', 'b', 'a']
# 如果想变回字符串,可以使用前面说的join。
5. 转置二维数组
aa = [['a','b'],['c','d'],['e','f']]
list(zip(*aa))
# [('a', 'c', 'e'), ('b', 'd', 'f')]
# 当然,你还可以这样写:
[[x[0] for x in aa],[x[1] for x in aa]]
# [['a', 'c', 'e'], ['b', 'd', 'f']]
6. 函数的调用居然也可以if…else
def product(a,b):
return a*b
def add(a,b):
return a+b
x = True
(product if x else add)(3,5)
# 15
7. 复制列表
a = [1,2,3,4]
b = a
b[0] = 10
b
# [10, 2, 3, 4]
a
# [10, 2, 3, 4]
# 由上可见,通过等号复制列表时,一个列表值改变,另一个也会随之改变!
a = [1,2,3,4]
b = a[:]
b[0] = 10
b
# [10, 2, 3, 4]
a
# [1, 2, 3, 4]
# 通过冒号复制,原列表不会随新列表值的改变而改变。
# 在python3中,通过a.copy()可以实现与冒号复制相同的效果。
8. 通过键值对字典元素进行排列
dd = {'apple':10, 'banana':15, 'orange':7}
sorted(dd.items(), key = lambda x:x[1])
# [('orange', 7), ('apple', 10), ('banana', 15)]
# 按照7,10,15的顺序对字典内容进行升序排列
9. 在python中不仅有if…else, 还有for…else
for…else可以用来检查for循环是否循环完成。
for a in range(3):
print(a)
if a == 4:
break
else:
print("for completed OK")
# 0
# 1
# 2
# for completed OK
10. 使用逗号链接字符
aa = ['This','is','a','test']
",".join(aa)
# 'This,is,a,test'
# 如果是数字,需要将数字转换成字符
bb = [1,2,3,4]
",".join(map(str,bb)) # map居然还可以这样使用!!
# '1,2,3,4'
# 我们还可以做一个有意思的事,用加号连接,然后求和
eval('+'.join(map(str,bb)))
# 10
# 这和使用sum(bb)求和结果是一样的。
11. 合并字典
d1 = {'apple':12}
d2 = {'banana':10}
{**d1,**d2}
# {'banana': 10, 'apple': 12}
# 在函数参数中,两个星号是将参数打包成字典,传递到函数中
12. 剔除列表中的重复元素
aa = [1,6,2,2,3,4,4,5]
list(set(aa))
# [1, 2, 3, 4, 5, 6]
# 你会发现, 虽然重复元素被踢出了,但是列表中元素的顺序也被重新排序了.
from collections import OrderedDict
OrderedDict.fromkeys(aa)
list(OrderedDict.fromkeys(aa).keys())
# [1, 6, 2, 3, 4, 5]
# 保持了原有元素顺序,同时踢出了重复元素!
Python是及其灵活的编程语言,近乎于自然语言。很多用法,只有你想不到的,没有做不到的。
====== THE END =====
参考资料来源于网络