比如要得到[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可以轻松办到,意外不意外:
>>> 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函数,可以实现很多有趣的变换:
>>> 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点就失效这种情况,这个时候就需要计算剩余秒数,有的语言(如PHP)可以很方便计算,Python则有些麻烦,各种datetime、timedelta折腾一番之后,发现还是如下实现最方便:
86400 - int(time()+8*3600) % 86400
+8小时为时差,毕竟time()返回的是子午线处的秒数。