三个实用的python函数

BG36

Posted by Blue Geek on October 22, 2019

三个实用的函数

By 青衣极客 Blue Geek In 2019-10-22

在使用python开发时常常有对序列中所有元素施加某种操作的需求,当然可以使用循环遍历来进行处理,只是有没有更简单的办法呢?本文就讨论python中的三个实用的函数,让大家在处理序列数据的时候多一种选择,而且是更好的选择,即map(), filter()和zip()。

1. map

在使用hadoop集群的时候,常常需要将输出转换为字符串的形式并指定连接符,对于一个列表数据,一般写法是使用循环将每个元素转换成str类型,然后使用join函数连接。当然,更低效率的方式是在循环中不断拼接。这时,如果使用map操作就会简单很多。map直接中str的构造函数作用在列表的每个元素上。不过需要注意的是在python3中map函数返回的结果是一个迭代对象,join函数可以接收迭代对象,这种操作就顺畅很多。

import random
a = [random.randint(0, 100) for i in range(10)]
# 一般做法
b = []
for x in a:
    b.append(str(x))
print('-'.join(b))

# 使用map
print('-'.join(map(str, a)))
11-48-59-7-48-95-54-4-56-52
11-48-59-7-48-95-54-4-56-52

2. filter

对于一个序列的数据,常常需要将满足某种条件的元素挑出来重新组成序列。这种需求的直观实现方式还是使用循环加分支判断,然后将符合条件的拼接到一个新的列表中。这时,如果使用filter函数,就会简单很多。在filter函数的第一个参数传入一个函数,当然也可以是lambda表达式,用于设定筛选的条件。还是需要注意,在python3中filter的返回结果也是一个迭代对象,可以使用list的构造函数将结果转换为列表。

# 一般做法
b = []
for x in a:
    if x < 50:
        b.append(x)
print(b)

# 使用filter
print(list(filter(lambda x: x<50, a)))
[11, 48, 7, 48, 4]
[11, 48, 7, 48, 4]

map和filter的好处不仅仅在于使代码和逻辑更简单,在处理数据量很大的序列时,也是更好的选择。因为map和filter都是返回迭代对象而不是将数据全都处理完成并存储,因此对于处理大数据时有内存压力的情况而言使用map和filter比使用循环遍历再拼接的方式更好。

3. zip

对于若干个等长的具有某种关联的序列数据,我们常常需要将这些数据联合起来进行遍历。通常做法是使用其中一个进行遍历并获取索引,然后使用索引或许其他需要关联的数据。对于新手而言,这样做是无可厚非的,而对于专业人士,这样显然是不妥。zip函数为这种情况提供了解决方案。

x = [random.randint(0, 100) for i in range(5)]
y = [random.randint(0, 100) for i in range(5)]
z = [random.randint(0, 100) for i in range(5)]

# 通常用法
for idx, i in enumerate(x):
    j = y[idx]
    k = z[idx]
    print("({},{},{})".format(i, j, k), end=' ')
print()
# 使用zip
for i, j, k in zip(x, y, z):
    print("({},{},{})".format(i, j, k), end=' ')
    
(88,0,49) (81,29,76) (29,6,71) (99,0,22) (95,54,11) 
(88,0,49) (81,29,76) (29,6,71) (99,0,22) (95,54,11) 

上文讨论了python中的三个简单实用的函数,对于希望以更简洁的方式使用python的朋友而言应该是很不错的。而对于不清楚python提供了这几个操作的朋友而言,很自然就会使用那种最一般的写法,虽然也不是什么错误,但终结并不pythonic。本文编写时参考的英文网页链接:https://towardsdatascience.com/3-advanced-python-functions-for-data-scientists-f869016da63a 。

【青衣极客】公众号



COMMENT

博客评论区功能由Github Issue提供,提交Issue时请以本文标题为话题

"BG36-三个实用的python函数"