A. python中的count函数问题
统计一个列表中每一个元素的个数在Python里有两种实现方式,
第一种是新建一个dict,键是列表中的元素,值是统计的个数,然后遍历list。
items=["cc","cc","ct","ct","ac"]
count={}
foriteminitems:
count[item]=count.get(item,0)+1
print(count)
#{'ac':1,'ct':2,'cc':2}
之中用到了一个小技巧,当dict中不还没有统计过一个元素时,直接索引count[item]会报错,而使用get方法count.get(item, 0)能够设置索引不存在的键时返回0。
第二种是使用Python内置的函数。统计元素的个数是一种非常常见的操作,Python的collection包里已经有一个Counter的类,大致实现了上面的功能。
fromcollectionsimportCounter
items=["cc","cc","ct","ct","ac"]
count=Counter(items)
print(count)
#Counter({'ct':2,'cc':2,'ac':1})
B. 用Python编写程序,输入16个整数,输出其中出现了多少个相同的数字要求输入:一
代码:
from collections import Counter
a = []
for i in range(16):
a.append(int(input("input score:"))) #注意缩进,网络太对代码太不友好了
b = dict(Counter(a))
print ("repeated nums:(value:count)")
print ({key:value for key,value in b.items()if value > 1})
输出:
input score:1
input score:2
input score:3
input score:4
input score:5
input score:6
input score:7
input score:8
input score:9
input score:10
input score:10
input score:9
input score:9
input score:8
input score:7
input score:7
repeated nums:(value:count)
{8: 2, 9: 3, 10: 2, 7: 3}
C. Python 统计列表里面有多少个元素
Python 统计列表里面有多少个元素步骤如下:
1、打开python语言命令窗口,定义一个列表变量Z并打印对应的列表值。
D. 如何用python实现英文短文的双词频统计
简单版:
#!/usr/bin/envpython3
importre
importjieba
fromcollectionsimportCounter
fname='counttest.txt'
withopen(fname)asf:
s=f.read()
pattern=re.compile(r'[a-zA-Z]+-?[a-zA-Z]*')
english_words=Counter(pattern.findall(s))
other_words=Counter(jieba.cut(pattern.sub('',s)))
print(' 英文单词统计结果: '+'-'*17)
print(' '.join(['{}:{}'.format(i,j)fori,jinenglish_words.most_common()]))
print(' 中文及符号统计结果: '+'-'*19)
print(' '.join(['{}:{}'.format(i,j)fori,jinother_words.most_common()]))
复杂版:
#!/usr/bin/envpython
#-*-coding:utf-8-*-
from__future__importprint_function,division,unicode_literals
importsys,re,time,os,jieba
fromcollectionsimportCounter
fromdatetimeimportdatetime
classWordCounter(object):
def__init__(self,from_file,to_file=None,coding=None,jieba_cut=None):
'''根据设定的进程数,把文件from_file分割成大小基本相同,数量等同与进程数的文件段,
来读取并统计词频,然后把结果写入to_file中,当其为None时直接打印在终端或命令行上。
Args:
@from_file要读取的文件
@to_file结果要写入的文件
@coding文件的编码方式,默认为采用chardet模块读取前1万个字符来自动判断
@jieba_cut是否启用结巴分词,默认为None
Howtouse:
w=WordCounter('a.txt','b.txt')
w.run()
'''
ifnotos.path.isfile(from_file):
raiseException('Nosuchfile:文件不存在')
self.f1=from_file
self.filesize=os.path.getsize(from_file)
self.f2=to_file
ifcodingisNone:
try:
importchardet
exceptImportError:
os.system('pipinstallchardet')
print('-'*70)
importchardet
withopen(from_file,'rb')asf:
coding=chardet.detect(f.read(10000))['encoding']
self.coding=coding
self._c=[Counter(),Counter()]
self.jieba=False
ifjieba_cutisnotNone:
self.jieba=True
defrun(self):
start=time.time()
if1:
self.count_direct(self.f1)
ifself.f2notin['None','Null','none','null',None]:
withopen(self.f2,'wb')asf:
f.write(self.result.encode(self.coding))
else:
print(' Englishwords: '+'-'*15)
print(self.result)
cost='{:.1f}'.format(time.time()-start)
size=humansize(self.filesize)
tip=' Filesize:{}.Costtime:{}seconds'
#print(tip.format(size,cost))
self.cost=cost+'s'
defcount_direct(self,from_file):
'''直接把文件内容全部读进内存并统计词频'''
start=time.time()
withopen(from_file,'rb')asf:
line=f.read()
foriinrange(len(self._c)):
self._c[i].update(self.parse(line)[i])
defparse(self,line):#解析读取的文件流
text=line.decode(self.coding)
text=re.sub(r'- ','',text)#考虑同一个单词被分割成两段的情况,删除行末的-号
pattern=re.compile(r'[a-zA-Z]+-?[a-zA-Z]*')#判断是否为英文单词
english_words=pattern.findall(text)
rest=pattern.sub('',text)
ex=Counter(jieba.cut(rest))ifself.jiebaelseCounter(text)
returnCounter(english_words),ex
defflush(self):#清空统计结果
self._c=[Counter(),Counter()]
@property
defcounter(self):#返回统计结果的Counter类
returnself._c
@property
defresult(self):#返回统计结果的字符串型式,等同于要写入结果文件的内容
ss=[]
forcinself._c:
ss.append(['{}:{}'.format(i,j)fori,jinc.most_common()])
tip=' 中文及符号统计结果: '+'-'*15+' '
returntip.join([' '.join(s)forsinss])
defhumansize(size):
"""将文件的大小转成带单位的形式
>>>humansize(1024)=='1KB'
True
>>>humansize(1000)=='1000B'
True
>>>humansize(1024*1024)=='1M'
True
>>>humansize(1024*1024*1024*2)=='2G'
True
"""
units=['B','KB','M','G','T']
forunitinunits:
ifsize<1024:
break
size=size//1024
return'{}{}'.format(size,unit)
defmain():
iflen(sys.argv)<2:
print('Usage:pythonwordcounter.pyfrom_fileto_file')
exit(1)
from_file,to_file=sys.argv[1:3]
args={'coding':None,'jieba_cut':1}
foriinsys.argv:
forkinargs:
ifre.search(r'{}=(.+)'.format(k),i):
args[k]=re.findall(r'{}=(.+)'.format(k),i)[0]
w=WordCounter(from_file,to_file,**args)
w.run()
if__name__=='__main__':
importdoctest
doctest.testmod()
main()
更复杂的:如果是比较大的文件,建议采用多进程,详情网络:多进程读取大文件并统计词频 jaket5219999