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认可的方案
我正在尝试编写一段代码,让用户输入姓名,然后读取文件并显示该用户有多少邮件。
文件名为 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认可的方案