row*_*ana 8 python dictionary iterator generator
我有一个由单词组成的文件,每行一个单词.该文件如下所示:
aaa
bob
fff
err
ddd
fff
err
Run Code Online (Sandbox Code Playgroud)
我想计算一对一出现的单词的频率.
例如,
aaa,bob: 1
bob,fff:1
fff,err:2
Run Code Online (Sandbox Code Playgroud)
等等.我试过这个
f=open(file,'r')
content=f.readlines()
f.close()
dic={}
it=iter(content)
for line in content:
print line, next(line);
dic.update({[line,next(line)]: 1})
Run Code Online (Sandbox Code Playgroud)
我收到了错误:
TypeError: str object is not an iterator
Run Code Online (Sandbox Code Playgroud)
然后我尝试使用迭代器:
it=iter(content)
for x in it:
print x, next(x);
Run Code Online (Sandbox Code Playgroud)
再次遇到同样的错误.请帮忙!
你只需要不断前行的轨迹,一个文件对象返回它自己的迭代器,所以你不需要ITER 或readlines方法可言,叫旁边劈头创造一个变量一次分组,然后自顾自地更新 分组在环:
from collections import defaultdict
d = defaultdict(int)
with open("in.txt") as f:
prev = next(f).strip()
for line in map(str.strip,f): # python2 use itertools.imap
d[prev, line] += 1
prev = line
Run Code Online (Sandbox Code Playgroud)
哪个会给你:
defaultdict(<type 'int'>, {('aaa', 'bob'): 1, ('fff', 'err'): 2, ('err', 'ddd'): 1, ('bob', 'fff'): 1, ('ddd', 'fff'): 1})
Run Code Online (Sandbox Code Playgroud)
line像所有人一样strs,它是一个非常有能力,这意味着它有一个__iter__方法.但是next与iter ators合作,它有一个__next__方法(在Python 2中它是一个next方法).当解释器执行时next(line),它会尝试调用line.__next__.由于line没有提出的__next__方法TypeError: str object is not an iterator.
既然line是一个能够并且有__iter__方法,我们可以设置it = iter(line).it是一个itor ator与__next__方法,并next(it)返回下一个字符line.但是你正在寻找文件中的下一行,所以尝试类似:
from collections import defaultdict
dic = defaultdict(int)
with open('file.txt') as f:
content = f.readlines()
for i in range(len(content) - 1):
key = content[i].rstrip() + ',' + content[i+1].rstrip()
dic[key] += 1
for k,v in dic.items():
print(k,':',v)
Run Code Online (Sandbox Code Playgroud)
输出(如OP中的file.txt)
err,ddd : 1
ddd,fff : 1
aaa,bob : 1
fff,err : 2
bob,fff : 1
Run Code Online (Sandbox Code Playgroud)