Python Grok学习:信箱中的字母

Python Grok学习:信箱中的字母,python,python-3.x,grok,Python,Python 3.x,Grok,我试图编写一个代码,让用户输入一个名字,然后读取一个文件,并显示该人有多少邮件 名为mail.txt的文件 Jane Fairfax,Letter Frank Churchill,Letter Emma Woodhouse,Letter Frank Churchill,Letter Harriet Smith,Package Emma Woodhouse,Letter Philip Elton,Package Emma Woodhouse,Package 该程序的工作原理如下: Name: E

我试图编写一个代码,让用户输入一个名字,然后读取一个文件,并显示该人有多少邮件

名为mail.txt的文件

Jane Fairfax,Letter
Frank Churchill,Letter
Emma Woodhouse,Letter
Frank Churchill,Letter
Harriet Smith,Package
Emma Woodhouse,Letter
Philip Elton,Package
Emma Woodhouse,Package
该程序的工作原理如下:

Name: Emma Woodhouse
2 Letters
1 Package
Name: Elizabeth Bennet
No mail
如果他们有一个包裹和两封信

Name: Jane Fairfax
1 Letter
No Packages
如果他们有一封信,没有包裹,并且此人没有任何邮件,那么您的程序应该如下所示:

Name: Emma Woodhouse
2 Letters
1 Package
Name: Elizabeth Bennet
No mail
这是到目前为止我的代码(不起作用)

这就是它的回报:

Name: Emma Woodhouse
0 Letters
3 Packages
我正在努力解决这个问题,我甚至还没有开始在中添加额外的元素!!! 我将继续努力,但一些帮助/输入将不胜感激!(我想我可能需要使用(def),但我不确定…)
谢谢

您的
l[1]
包含一个新行字符。如果您打印它,您将看到它=='Letter\n',因此不等于'Letter'

您可以
.strip()
您的行或l[1],或者使用
如果l[1]中的“字母”
使其可以容纳空白


因为它与“字母”不匹配,所以它总是进入else(package)块。您可能应该显式地测试包,并将else子句作为未知的异常情况进行测试。

以下是一个简单的解决方案:

import collections

mail = collections.defaultdict(list)
with open('mail.txt') as f:
  for line in f:
    person, item = line.strip().split(',')
    mail[person].append(item)

person = input('Name: ')
if person not in mail:
  print('No mail')
else:
  for item in ('Letter', 'Package'):
    count = mail[person].count(item)
    if count == 0:
      print('No', item + 's')
    elif count == 1:
      print(1, item)
    else:
      print(count, item + 's')
这也是Grok Learning认可的解决方案