Python 使用dict嵌套for循环

Python 使用dict嵌套for循环,python,python-2.7,dictionary,Python,Python 2.7,Dictionary,我正在做一个Coursera python练习,在编写代码时遇到了困难 问题如下: 编写一个程序,通读mbox short.txt,找出谁发送的邮件数量最多。程序查找“发件人”行,并将这些行中的第二个字作为发送邮件的人 该程序创建一个Python字典,将发件人的邮件地址映射到文件中出现的次数计数。字典生成后,程序使用最大循环读取字典,以查找最多的提交者 示例文本文件位于以下行中: 预期产出应为: cwen@iupui.edu 5 这是我的代码: name = raw_input("

我正在做一个Coursera python练习,在编写代码时遇到了困难

问题如下:

编写一个程序,通读
mbox short.txt
,找出谁发送的邮件数量最多。程序查找“发件人”行,并将这些行中的第二个字作为发送邮件的人


该程序创建一个Python字典,将发件人的邮件地址映射到文件中出现的次数计数。字典生成后,程序使用最大循环读取字典,以查找最多的提交者

示例文本文件位于以下行中:

预期产出应为:

cwen@iupui.edu 5
这是我的代码:

name = raw_input("Enter file:")
if len(name) < 1 : name = "mbox-short.txt"
handle = open(name)
count = dict()

for line in handle:
    word = line.split()
    if line.startswith('From '):
        email = word[1]
        for sender in email:
            if sender not in count:
                count[sender] = count.get(sender, 0) + 1

bigcount = None
bigname = None
for name,count in count.items():
    if bigname is None or count > bigcount:
        bigname = name
        bigcount = count
print bigname, bigcount

我认为“电子邮件中的发件人”部分有问题,但无法确定它如何导致不希望的输出。

以下循环在这种情况下不合适,因为您基本上是在迭代电子邮件地址的所有字符

for sender in email:
   ...
这就是为什么在打印计数最大的电子邮件地址时,会得到一个字符
。在循环结束时打印计数后,可以很容易地看到效果

以下检查也是多余的,因为当您使用
get
方法获取字典值时,隐式地检查它

if sender not in count:
   ...
因此,最终更正的代码应该是这样的

name = raw_input("Enter file:")
if len(name) < 1:
    name = "mbox-short.txt"
handle = open(name)
count = dict()

for line in handle:
    word = line.split()
    if line.startswith('From '):
        count[word[1]] = count.get(word[1], 0) + 1
largest = 0
email = ''
for k in count:
    if count[k] > largest:
        largest = count[k]
        email = k
print largest, email
name=raw\u输入(“输入文件:”)
如果len(名称)<1:
name=“mbox short.txt”
句柄=打开(名称)
count=dict()
对于线输入句柄:
word=line.split()
如果line.startswith('From'):
count[word[1]]=count.get(word[1],0)+1
最大值=0
电子邮件=“”
对于k计数:
如果计数[k]>最大:
最大=计数[k]
电子邮件=k
打印、发送电子邮件
name=raw\u输入(“输入文件:”)
如果len(name)<1:name=“mbox short.txt”
句柄=打开(名称)
单词=列表()
计数=dict()
对于线输入句柄:
words=line.split()
如果单词==[]:继续
如果单词[0]!='从:继续
计数[字[1]]=计数。获取(字[1],0)+1
#打印计数
maxval=None
maxkey=None
对于kee,val在counts.items()中:
如果maxval==None:maxval=val
如果maxval
name=raw\u输入(“输入文件:”)
如果len(name)<1:name=“mbox short.txt”
fl=打开(名称)
#fl=open('C:\Users\Algoritm\Documents\Python-Coursera\mbox-short.txt')
lst=列表()
count=dict()
#扫描文件并创建一个列表
对于fl中的\u文件中的\u行:
xx=文件.rstrip().split()中的行
如果不在_文件中的_行。startswith('From'):继续#如果在行中,则保留它
word=文件.split()中的行
#印刷字[1]
xx=单词[1]
#对于xx中的索引:#在单词列表中查找重复的单词
第一次追加(xx)
#打印lst
lis=lst
对于lis中的x:
count[x]=count.get(x,0)+1
#打印计数
bigcount=None
bigwords=无
对于x,y,在count.items()中:
如果bigcount为None或y>bigcount:
bigwords=x
bigcount=y
打印bigwords,bigcount
fname=input(“输入文件名”)
fhandle=open(fname,'r')
发送方=dict()
对于fhandle中的行:
如果行开始于(“起始”):
发送方[line.split()[1]]=sender.get(line.split()[1],0)+1
最大密钥=无
最大值=无
对于键,sender.items()中的值:
如果最大值为无或最大值<值:
最大值=最大值
最大键=键
打印(最大值、最大值)

我也在上Python课程。由于我是新手,我正在分享我的作业代码。对我来说,关键的部分是首先使用,如果不是线,然后分割它。
counts=dict()
fname=input('输入文件:')
如果len(fname)num:
num=v
键=k
打印(num,key)
name=input(“输入文件:”)
如果len(name)<1:name=“mbox short.txt”
name=“mbox short.txt”
句柄=打开(名称)
text=handle.read()
#words=text.split()
单词=列表()
对于线输入句柄:
如果不是line.startswith(“From:”):继续
line=line.split()
words.append(第[1]行)
计数=dict()
用文字表示:
计数[字]=计数。获取(字,0)+1
maxval=None
maxkey=None
对于键,值在counts.items()中:
#如果maxval==None:maxval=val
如果val>maxval:
maxval=val
maxkey=key
打印(maxkey,maxval)
counts=dict()
名称=输入(“输入文件:”)
如果len(name)<1:name=“mbox short.txt”
fhand=打开(名称)
对于fhand中的线路:
line=line.rstrip()
如果不是line.startswith('From'):继续
words=line.split()
计数[字[1]]=计数。获取(字[1],0)+1
st=0
对于k in计数:
如果计数[k]>st:
st=计数[k]
addy=k
印刷品(艾迪,圣)

谢谢您的更正。我已经看到了结果的不同。但我想知道,当我使用split()将“行”拆分为“字”时,我正在制作一个包含所有电子邮件地址的列表。循环没有迭代列表中的所有地址吗?当您拆分一行时,您会得到一行中的所有单词作为列表,但不是您的案例中的所有电子邮件地址。程序会创建一个Python字典,将发件人的邮件地址映射到它们在文件中出现的次数计数。在生成字典后,程序通过字典使用最大循环来查找最多产的提交者。请考虑解释您对OP的答案。请添加一些解释,说明这是如何解决问题的,或者这与现有答案有何不同。
name = raw_input("Enter file:")
if len(name) < 1:
    name = "mbox-short.txt"
handle = open(name)
count = dict()

for line in handle:
    word = line.split()
    if line.startswith('From '):
        count[word[1]] = count.get(word[1], 0) + 1
largest = 0
email = ''
for k in count:
    if count[k] > largest:
        largest = count[k]
        email = k
print largest, email
name = raw_input("Enter file:")
if len(name) < 1 : name = "mbox-short.txt"
handle = open(name)
words = list()
counts = dict()

for line in handle:
    words = line.split()
    if words == []: continue
    if words[0] != 'From': continue
    counts[words[1]] = counts.get(words[1],0) + 1
    #print counts


maxval = None
maxkey = None

for kee, val in counts.items():
    if maxval == None: maxval = val
    if maxval < val: 
        maxval = val
        maxkey = kee
print maxkey, maxval
name = raw_input("Enter file:")
if len(name) < 1 : name = "mbox-short.txt"
fl = open(name)

#fl=open('C:\Users\Algoritm\Documents\Python Coursera\mbox-short.txt')
lst=list()
count=dict()

#scan the file and create a list
for lines_in_the_file in fl:
xx=lines_in_the_file.rstrip().split()
if not lines_in_the_file.startswith('From '): continue #if in the line keep it
word=lines_in_the_file.split()
#print word[1]
xx=word[1]
#for index in xx: #find repeted words in the list Word
lst.append(xx)

#print lst
lis=lst
for x in lis:
count[x]=count.get(x,0)+1

#print  count
bigcount=None
bigwords=None



for x, y in count.items():
if bigcount is None or y>bigcount:
   bigwords=x
   bigcount=y
print bigwords, bigcount
name = input("Enter the file name:")
handle = open(name)
new = dict()
#count = 0
for line in handle:
 word = line.split()
 if line.startswith("From "):
    new[word[1]] = new.get(word[1],0) + 1
largest = 0
email = None
for k,v in new.items():
 if email is None or v > largest:
    largest = v
    email = k
print (email,largest)
fname = input("Enter The File Name")
fhandle = open(fname,'r')

sender = dict()
for line in fhandle:
    if line.startswith("From "):
        sender[line.split()[1]] = sender.get(line.split()[1],0) + 1

max_key = None
max_val = None

for key,value in sender.items():
    if max_val is None or max_val < value :
        max_val = value
        max_key = key

print(max_key,max_val)
fname=input('enter the file name: ')
d=dict()
try:
    fhand=open(fname,'r')
except:
    print('file not found')
    exit()

for line in fhand: 

    if line.startswith("From:"):
        srt=line.find(' ')
        sl=line[srt:-1]

        if sl not in d:
            d[sl]=1
        else:
            d[sl]+=1

print(d)
largest= 0
email=''

for key in d:
    if d[key] > largest:
        largest=d[key]
        email=key
print(email,': ',largest)
name = input("Enter file:")
if len(name) < 1 : name = "mbox-short.txt"
name = "mbox-short.txt"
handle = open(name)
text = handle.read()
#words = text.split()

words = list()

for line in handle:
    if not line.startswith("From:") : continue
    line = line.split()
    words.append(line[1])


counts = dict()

for word in words:
           counts[word] = counts.get(word, 0) + 1 


maxval = None
maxkey = None
for key,val in counts.items() :
#   if maxval == None : maxval = val
  if val > maxval:
      maxval = val
      maxkey = key   

print (maxkey, maxval)
counts = dict()
name = input("Enter file:")
if len(name) < 1 : name = "mbox-short.txt"
fhand = open(name)
for line in fhand:
       line = line.rstrip()
       if not line.startswith('From ') : continue
       words = line.split()            
       counts[words[1]]=counts.get(words[1],0)+1 
st = 0 
for k in counts:
       if counts[k] > st :
       st = counts[k]
       addy = k
print (addy, st)