如下列表,想提取出每个元素中的第一个元素,即[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()
的写法,在一些情况下还是很方便的。
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