Python一些聪明且有趣的写法

统计满足条件的个数

比如要得到[3, 4, 1, 8, 3]里大于2的元素个数,不用for循环,可以这么来写:

l = [3, 4, 1, 8, 3]
sum(i>2 for i in l)

其实就是在求和的时候,True会认为是1,False认为是0.

使用sum将二维数组打平成一维

这个情况比较少见,正好一个二维数组需要把各个元素拿出来整理成一个一维数组,使用sum可以轻松办到,意外不意外:

>>> s = [['a', 'b'], ['c'], ['d', 'e', 'f']]
>>> sum(s, [])
['a', 'b', 'c', 'd', 'e', 'f']

找到第一个符合条件的元素

举个例子,要找到第一个大于2的元素值:

next(i for i in l if i > 2)

next会依次迭代,满足条件后就不用再继续了,所以效率是很高的。

如果是要返回元素的次序值,可以这么写:

next(i for i,j in enumerate(l) if j > 2)

神奇的zip

时常需要对一个二维数组进行结构调整,借助神奇的zip函数,可以实现很多有趣的变换:

>>> a = [(1, 2, 3), (4, 5, 6)]
>>> zip(*a)
[(1, 4), (2, 5), (3, 6)]
>>> zip(*zip(*a)) == a
True

注意:在 python3里,zip返回的是一个迭代器,所以需要加上list()转换,在python2里不存在这个问题。

再比如常见的数据列表的格式转换:

>>> a = [{'name': 'abc', 'age': 100}, {'name': 'def', 'age': 90}, {'name': 'aaa', 'age': 12}]
>>> dict(zip(a[0].keys(), zip(*[i.values() for i in a])))
{'age': (100, 90, 12), 'name': ('abc', 'def', 'aaa')}

>>> b = {'age': (100, 90, 12), 'name': ('abc', 'def', 'aaa')}
>>> [dict(zip(b.keys(), i)) for i in zip(*[v for v in b.values()])]
[{'age': 100, 'name': 'abc'},
 {'age': 90, 'name': 'def'},
 {'age': 12, 'name': 'aaa'}]

计算到当晚凌晨12点的秒数

时常需要将缓存设置到今天内有效果,过了晚上12点就失效这种情况,这个时候就需要计算剩余秒数,有的语言(如PHP)可以很方便计算,Python则有些麻烦,各种datetime、timedelta折腾一番之后,发现还是如下实现最方便:

86400 - int(time()+8*3600) % 86400

+8小时为时差,毕竟time()返回的是子午线处的秒数。

发表于 2018年08月24日 19:49   评论:0   阅读:2734  



回到顶部

首页 | 关于我 | 关于本站 | 站内留言 | rss
python logo   django logo   tornado logo