Python內置函數map、reduce、filter在文本處理中的應用

在Python內置函數map、reduce、filter在文本處理中的應用是一門比較簡單的知識點了,下面我們一起來看看這三個函數的用法。

文件是由很多行組成的,這些行組成一個列表,python提供了處理列表很有用的三個函數:map、reduce、filter。因此在文本處理中,可以使用這三個函數達到代碼的更加精簡清晰。

這裏的map、reduce是python的內置函數,跟hadoop的map、reduce函數沒有關系,不過使用的目的有點類似,map函數做預處理、reduce函數一般做聚合。

map、reduce、filter在文本處理中的使用

下面是一個文本文件的內容,第1列是ID,第4列是權重,我們的目標是獲取所有ID是奇數的行,將這些行的權重翻倍,最後返回權重值的總和。

ID 鍵 值 權重
1 name1 value1 11
2 name2 value2 12
3 name3 value3 13
4 name4 value4 14
5 name5 value5 15
6 name6 value6 16
7 name7 value7 17
8 name8 value8 18
9 name9 value9 19
10 name10 value10 20

使用filter、map、reduce函數的代碼如下;

代碼如下

#coding=utf8

'''
Created on 2013-12-15

@author: www.111cn.net
'''
import pprint

def read_file(file_path):
'''
讀取文件的每一行,按t分割後返回字段列表;
'''
with open(file_path,"r") as fp:
for line in fp:
fields=line[:-1].split("t")
yield fields
fp.close()

def is_even_lines(fields):
'''
判斷該行是否第一列的數字爲偶數;
'''
return int(fields[0])%2==0

def double_weights(fields):
'''
將每一行的權重這一字段的值翻倍
'''
fields[-1]=int(fields[-1])*2
return fields

def sum_weights(sum_value, fields):
'''
累加數字x到數字sum_value上面;
返回新的sum_value值;
'''
sum_value+=int(fields[-1])
return sum_value

if __name__=="__main__":
#讀取文件中的所有行
file_lines=[x for x in read_file("test_data")]
print '文件中原始的行:'
pprint.pprint(file_lines)

print '----'

#過濾掉ID爲偶數的行
odd_lines=filter(is_even_lines,file_lines)
print '過濾掉ID爲偶數的行:'
pprint.pprint(odd_lines)

print '----'

#將每行的權重值翻倍
double_weights_lines=map(double_weights,odd_lines)
print '將每行的權重值翻倍:'
pprint.pprint(double_weights_lines)

print '----'

#計算所有的權重值的和
#由于傳給sum函數的每個元素都是一個列表,所以需要先提供累加的初始值,這裏指定爲0
sum_val=reduce(sum_weights, double_weights_lines, 0)
print '計算每行權重值的綜合:'
print sum_val

運行結果:

文件中原始的行:

代碼如下
[['1', 'name1', 'value1', '11'],
['2', 'name2', 'value2', '12'],
['3', 'name3', 'value3', '13'],
['4', 'name4', 'value4', '14'],
['5', 'name5', 'value5', '15'],
['6', 'name6', 'value6', '16'],
['7', 'name7', 'value7', '17'],
['8', 'name8', 'value8', '18'],
['9', 'name9', 'value9', '19'],
['10', 'name10', 'value10', '20']]
----
過濾掉ID爲偶數的行:
[['2', 'name2', 'value2', '12'],
['4', 'name4', 'value4', '14'],
['6', 'name6', 'value6', '16'],
['8', 'name8', 'value8', '18'],
['10', 'name10', 'value10', '20']]
----
將每行的權重值翻倍:
[['2', 'name2', 'value2', 24],
['4', 'name4', 'value4', 28],
['6', 'name6', 'value6', 32],
['8', 'name8', 'value8', 36],
['10', 'name10', 'value10', 40]]
----
計算每行權重值的綜合:
160

map、reduce、filter函數的特點

•filter函數:以列表爲參數,返回滿足條件的元素組成的列表;類似于SQL中的where a=1
•map函數:以列表爲參數,對每個元素做處理,返回這些處理後元素組成的列表;類似于sql中的select a*2
•reduce函數:以列表爲參數,對列表進行累計、彙總、平均等聚合函數;類似于sql中的select sum(a),average(b)
這些函數官方的解釋

map(function, iterable, …)

Apply function to every item of iterable and return a list of the results. If additional iterable arguments are passed, function must take that many arguments and is applied to the items from all iterables in parallel. If one iterable is shorter than another it is assumed to be extended with None items. If function is None, the identity function is assumed; if there are multiple arguments, map() returns a list consisting of tuples containing the corresponding items from all iterables (a kind of transpose operation). The iterable arguments may be a sequence or any iterable object; the result is always a list.

reduce(function, iterable[, initializer])

Apply function of two arguments cumulatively to the items of iterable, from left to right, so as to reduce the iterable to a single value. For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates ((((1+2)+3)+4)+5). The left argument, x, is the accumulated value and the right argument, y, is the update value from the iterable. If the optional initializer is present, it is placed before the items of the iterable in the calculation, and serves as a default when the iterable is empty. If initializer is not given and iterable contains only one item, the first item is returned. Roughly equivalent to:

代碼如下

def reduce(function, iterable, initializer=None):
it = iter(iterable)
if initializer is None:
try:
initializer = next(it)
except StopIteration:
raise TypeError('reduce() of empty sequence with no initial value')
accum_value = initializer
for x in it:
accum_value = function(accum_value, x)
return accum_value​

filter(function, iterable)

Construct a list from those elements of iterable for which function returns true. iterable may be either a sequence, a container which supports iteration, or an iterator. If iterable is a string or a tuple, the result also has that type; otherwise it is always a list. If function is None, the identity function is assumed, that is, all elements of iterable that are false are removed.

Note that filter(function, iterable) is equivalent to [item for item in iterable if function(item)] if function is not None and [item for item in iterable if item] if function is None.

See itertools.ifilter() and itertools.ifilterfalse() for iterator versions of this function, including a variation that filters for elements where the function returns false.

更多相關文章
  • 本文我們來講講Python的內置函數help()命令的使用方法,help()看字面就知道是幫助的意思,沒錯,這個就是幫助函數,如果我們不知道某函數的使用,就可以help一下.help函數是python的一個內置函數,在python基礎知識中介紹過什麽是內置函數,它是python自帶的函數,任何時候都
  • Python教程 dir()內置函數作用及使用方法
    本教程我們來講講>Python內置的dir()函數是幹什麽用的,在什麽情況下使用這個方法,學習Python的同學可以看看.dir()內置函數作用python內置方法有很多,無論是初學還是經通python的程序員都不能全部記住所有方法,這時候dir()函數就非常有用了.使用dir()函數可以查看 ...
  • 用C++實現python字符串分割函數 split()與rsplit()實例
    本教程我們分享用C/C++實現python字符串函數 split()與rsplit() 的方法,split函數在python中是比較常見的.本文我們將實現兩個python字符串分割函數.這兩個函數的函數原型爲:split(spe = None,maxsplit= -1)rsplit(spe= Non ...
  • TYPE()函數 功能: 返回表達式的值的類型; 語法結構: TYPE(cExpression)其中,表達式必須要用引號; 相關數據類型: 日期型-Date, 日期時間型-DateTime, 邏輯型-Logical;
  • strtotime函數的使用在時間日期處理上是非常的強大了,這裏我們一起來看看strtotime函數內核與常用方法.PHP strtotime函數將任何英文文本的日期時間描述解析爲Unix時間戳[將系統時間轉化成unix時間戳]一,獲取指定日期的unix時間戳 strtotime(”2009-1-2 ...
  • PHP的strtotime() 函數將任何英文文本的日期時間描述解析爲 Unix 時間戳.現在我們來講講strtotime函數源碼分析及使用方法.源碼位置:extdatephp_date.c 代碼如下 /* {{{ proto int strtotime(string time [, int now
  • 在php中我給大家介紹兩個比較常用的數組過濾函數array_filter與array_unique了,一個是過濾數組空值,一個是過濾數組重複值,我們現在一起來看看.語法array_filter(array,funct
  • 如果要過濾html標簽多半同學都使用php的函數了,但是大家不知道是可以直接在mysql中進行去除htm標簽吧,下面一起來看看吧.mysql本身沒有去除html代碼的內置函數,但是在一些情況下,不得不在數據庫層次提取一些去除了html代碼的純文本.經過谷歌後,找到了以下兩個函數,經測試,均可用.函數 ...
一周排行