标题说是技巧,其实也是常常遇到的一些问题,有些方法尽管可以解决问题甚至是常用的,但是python提供了更好的解决方法。对应的演示我会注明推荐和不推荐的用法。
判断列表空数据
经常我们需要判断列表是否为空,都是用len判断长度,其实python自动会将空列表判断为False,因此直接判断即可,如下:
def test1():
arr1 = [1, 2, 3, 4, 5]
arr2 = []
# 不推荐
if len(arr1)!=0:
print("arr1 is not empty-len!")
if len(arr2)!=0:
print("arr2 is not empty-len!")
# 推荐
if arr1:
print("arr1 is not empty!")
if arr2:
print("arr2 is not empty!")
字典键值是否存在
经常需要取字典的键对应的值,但是一般我们会先判断键是否存在,然后再取对应值,如果直接取键不存在的字典值会报异常,可以使用get函数,它在键不存在时返回None,甚至我们可以封装一个键不存在时返回默认值的函数,如下:
def test2():
dict1 = {1:"val1", 2:"val2", 3:"val3", 5:"val5" }
print(dict1)
# 不推荐
for i in xrange(1,6):
if dict1.has_key(i):
print("%s->%s\n" %(i, dict1[i]))
# 推荐
for i in xrange(1, 6):
v = dict1.get(i)
if v:
print("%s->%s\n" %(i, v))
print(get_default(dict1, 3, "default"))
print(get_default(dict1, 4, "default"))
def get_default(dict, key, default):
v = dict.get(key)
if v:
return v
else:
return default
遍历同时获取索引
经常会遇到遍历列表同时需要获取当前索引序号的场合,一般我们是按长度生成range/xrange索引来访问,实际上python提供了enumerate函数,它会返回包装后的迭代器,每次调用同时返回当前索引和值,如下:
def test3():
l1 = [11, 22, 30, 41, 51]
# 不推荐
for i in xrange(0, 5):
print("%s->%s" %(i, l1[i]))
# 推荐
for i, v in enumerate(l1):
print("%s->%s" % (i, v))
同时遍历多个列表
经常需要同时遍历两个列表,取对应值来做操作,一般我们是按长度生成range/xrange索引来分别访问,实际上python提供了zip函数,它会返回包装后的迭代器,每次调用同时返回每个列表的值,如下:
def test4():
l1 = [11, 22, 30, 41, 51]
l2 = ["a", "bb", "c", "d", "ee"]
# 不推荐
for i in xrange(0, 5):
print("%s->%s" %(l1[i], l2[i]))
# 推荐
for v1, v2 in zip(l1, l2):
print("%s->%s" % (v1, v2))
字典列表生成式
通常推荐对列表遍历优先使用列表生成式,但是其实字典也支持和推荐优先使用列表生成式,如下:
def test5():
dict1 = {1: "val1", 2: "val2", 3: "val3", 5: "val5"}
dict2 = {k*2: v for k, v in dict1.items()}
print(dict2)
演示代码下载链接
原创,转载请注明来自http://blog.csdn.net/wenzhou1219