编写pythonic的代码

钦枫
2023-12-01

提取列表元素

如下列表,想提取出每个元素中的第一个元素,即[3,4,5],如何用代码简洁实现

MyList = []
MyList.append((3,[2,3],{"Name":"Tom","Age":6}))
MyList.append((4,[7,0],{"Name":"Jim","Age":9}))
MyList.append((5,[4,9],{"Name":"Sam","Age":10}))
print(MyList)

其实列表元素可以正常索引,如

MyList[0][2]['Age']  # 6

因此通过循环提取一列元素并不困难,但如果想用一行代码实现,则可以采用下面的方式

col1 = [tple[0] for tple in MyList]
print(col1)   #[3,4,5]

col2 = [MyList[i][0] for i in range(len(MyList))]
print(col2)   #[3,4,5]

网上有不少pythonic编程习惯的小结文章,可以参考
代码这样写不止于优雅(Python版)
值得收藏!15个 Pythonic 的代码示例
给大家整理了19个pythonic的编程习惯(小结)
Python-pythonic

限幅

有时需要对一个值 x 进行限幅操作 x∈[-xm,xm],但又不想用 if 这样的方法。
一个直接的思路是 x = min(|x|,xm)*sign(x),但意外的是 python math库中竟然没有sign函数,最后采用的是下面的方式

x = min(abs(x),xm)*((x>0)-(x<0))

后来又发现 numpy 有一个函数 clip,可以用于实现这个功能。

numpy.clip(a, a_min, a_max, out=None)
# a : array
# a_min : 要限定范围的最小值
# a_max : 要限定范围的最大值
# out : 要输出的array,默认值为None,也可以是原array

三目运算符

python 中的三目运算符常常能使代表表达更简介,如 max = a if a>b else b,最近看到一种新的表达,感觉很新鲜。

import numpy as np

done = False
f = 2
a = np.array([5,7])
b = np.array([13,9])
other = (f, 0.0 if done else 0.99, *a, *b)
print(other)

可以看到中间的a和b前面多了一个星号(关于星号的含义),得到的运算结果是

(2, 0.99, 5, 7, 13, 9)

也就是说把a和b中的元素接到后面了。注意这里a和b不能是单独的数字,否则会报错'float' object is not iterable,所以应该是列表或者numpy数组。如果不加乘号的话,得到的结果将会是把 list 或 array 整个接到后面而不是提取元素接到后面。

(2, 0.99, array([5, 7]), array([13, 9]))
或者
(2, 0.99, [5, 7], [13, 9])

这样一个写法避免了判断和np.concatenate()的写法,在一些情况下还是很方便的。

检查Python列表中的任何项是否为None

list_1 = [0, 1, None, 4]

list_2 = [0, 1, 3, 4]

any(x is None for x in list_1)
>>>True

any(x is None for x in list_2)
>>>False
 类似资料: