Grok 学习:信箱中的字母

Grok learning: Letters in the letterbox

我正在尝试编写一段代码,让用户输入姓名,然后读取文件并显示该用户有多少邮件。

文件名为 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

如果他们有 1 个包裹和 2 个字母,

Name: Jane Fairfax
1 Letter
No Packages

如果他们有 1 封信但没有包裹,并且如果此人没有任何邮件,您的程序应该像这样工作:

Name: Elizabeth Bennet
No mail

到目前为止,这是我的代码(不起作用)

name = input('Name: ')
mail = open('mail.txt')
m = mail.readlines()
l = ''
ln = 0 
p = []
pn= 0 
for line in m:
  if name in line:
    l= line.split(',')
    if l[1] == 'Letter':
      ln= ln+1
    else:
      pn = pn+1
print(str(ln) + ' Letters\n' + str(pn) + ' Packages')

这就是它 returns:

Name: Emma Woodhouse
0 Letters
3 Packages

我正在努力解决这个问题,我什至还没有开始添加额外的元素!!! 我会继续努力,但一些 help/input 将不胜感激! (我想我可能必须使用 (def) 但我不确定......) 谢谢!

您的 l[1] 包含换行符。如果你打印它,你会看到它 == 'Letter\n' 因此不等于 'Letter'.

您可以 .strip() 您的线路或 l[1] 或使用 if 'Letter' in l[1] 使其变得白色 space 宽容。

因为它不匹配 'Letter' 它总是进入 else(包)块。您可能应该显式测试包并将 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认可的方案