TypeError:str对象不是迭代器

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)

再次遇到同样的错误.请帮忙!

Pad*_*ham 6

你只需要不断前行的轨迹,一个文件对象返回它自己的迭代器,所以你不需要ITERreadlines方法可言,叫旁边劈头创造一个变量一次分组,然后自顾自地更新 分组在环:

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)


Cra*_*ler 5

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)