今天,借助一个python文本统计的程序,整理一些自己不懂的函数运用、知识点。例如append()与extend()、rstrip()、sorted()、zip()、index(),函数式编程的map、reduce.
1、append():向列表的尾部添加一个新的元素。只接受一个参数
2、extend():只接受一个列表作为参数,并将该参数的每个元素都添加到原有的列表中
3、rstrip() :删除 string 字符串末尾的指定字符(默认为空格)
4、zip():它是Python的一个内建函数,它接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个tuple(元组),然后返回由这些tuples组成的list(列表)。若传入参数的长度不等,则返回list的长度和参数中长度最短的对象相同。利用*号操作符,可以将list unzip(解压)。
举例说明:
>>> a = [1,2,3]
>>> b = [4,5,6]
>>> c = [4,5,6,7,8]
>>> zipped = zip(a,b)
[(1, 4), (2, 5), (3, 6)]
>>> zip(a,c)
[(1, 4), (2, 5), (3, 6)]
>>> zip(*zipped)
[(1, 2, 3), (4, 5, 6)]
5、index(str):检测字符串中是否包含子字符串 str,返回字符所在位置 index = word1.index(word)
6、sorted(iterable, cmp=None, key=None, reverse=False)
如果是一个列表很简单,如下:
>>> a=[4,5,6,7,3,2,9]
>>> b=sorted(a)
>>> print b
[2, 3, 4, 5, 6, 7, 9]
如果是一个元组构成的列表,就要用参数key。lambda是一个隐函数,是固定写法,不要写成别的单词;a_tuple表示列表中的一个元素,在这里,表示一个元组,a_tuple只是临时起的一个名字,你可以使用任意的名字;a_tuple[0]表示元组里的第一个元素,当然第二个元素就是a_tuple[1];所以这句命令的意思就是按照列表中元组里的第一个元素进行排序。
如下:
>>> a=[('c',2),('b',4),('a',3)]
>>> b=sorted(a,key=lambda ab:ab[0])
>>> print b
[('a', 3), ('b', 4), ('c', 2)]
>>> c=sorted(a,key=lambda ab:ab[1])
>>> print c
[('c', 2), ('a', 3), ('b', 4)]
>>>
使用reverse参数实现倒序排列:
>>> c=sorted(a,key=lambda ab:ab[1],reverse=1)
>>> print c
[('b', 4), ('a', 3), ('c', 2)]
7、map(function,list):二元函数,对list中的每个元素执行function函数定义的操作
8、reduce():直接上代码:
>>> a=[1,2,3]
>>>> def add(a,b):
return a+b
>>> b=reduce(add,a)
>>> print b
6
全部代码:文本高频词统计
代码来源:网易云课堂:用Python做些事
def readFile(file_name):
f=open(file_name,'r')
y=[]
x=f.readlines()
for line in x:
y.extend(line.split())
#append() 方法向列表的尾部添加一个新的元素。只接受一个参数。
#extend()方法只接受一个列表作为参数,并将该参数的每个元素都添加到原有的列表中。
f.close()
word_list2 = []
#单词格式化
for word in y:
# last character of each word
word1 = word
# use a list of punctuation marks
while True:
lastchar = word1[-1:]
if lastchar in [",", ".", "!", "?", ";",'"']:
word2 = word1.rstrip(lastchar)
# rstrip() 删除 string 字符串末尾的指定字符(默认为空格)
word1 = word2
else:
word2 = word1
break
while True:
firstchar = word2[0]
if firstchar in [",", ".", "!", "?", ";",'"']:
word3 = word2.lstrip(firstchar)
word2 = word3
else:
word3 = word2
break
# build a wordList of lower case modified words
word_list2.append(word3.lower())
#统计词频
freq_list = []
word_saved = []
for word2 in word_list2:
if not word2 in word_saved:
word_saved.append(word2)
freq_list.append((word2,word_list2.count(word2)))
#排序
sorted_list = sorted(freq_list,key=lambda x:x[1],reverse=True)
return sorted_list
# 合并统计函数
def mergeStatic(list1,list2):
word1,num1=zip(*list1)
# zip接受2个列表,组成元组的列表,zip*是拆分,zip的反操作
merge_list = []
#将list2中的word加入到merge_list
for word,num in list2:
if not word in word1:
merge_list.append((word,num))
else:
index = word1.index(word)
# index()检测字符串中是否包含子字符串 str,返回字符所在位置
merge_list.append((word,num+num1[index]))
#将list1中没有统计到merge_list的word加入
word2,num2=zip(*list2)
for word,num in list1:
if not word in word2:
merge_list.append((word,num))
#排序
sorted_list = sorted(merge_list,key=lambda x:x[1],reverse=True)
return sorted_list
if __name__=="__main__":
file_list = ['article_000.txt','article_001.txt','article_002.txt','article_003.txt','article_004.txt','article_005.txt']
cc=map(readFile,file_list)
word_list = reduce(mergeStatic,cc)
# 对所有文章依次进行mergestatic()函数操作,返回最后结果
print "最常用的单词排行榜:"
for word in word_list[0:10]:
print "%-5s %d" % (word[0], word[1])
参考链接: