Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
计算一个人收到的信件和包裹的数量-Python_Python_String - Fatal编程技术网

计算一个人收到的信件和包裹的数量-Python

计算一个人收到的信件和包裹的数量-Python,python,string,Python,String,我的程序应该读入一个名为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 我

我的程序应该读入一个名为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
我的程序应该是这样工作的:

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
这是我的代码:

q = input("Name: ")
p = open("mail.txt", "r")
name_list = p.readlines()
lista = {}

for i in name_list:
  i = i[:-1]
  name_list = i

我不知道下一步该怎么做。有什么建议吗?谢谢

首先,我们可以使用列表理解来解析文件本身

In [1]: with open("mail.txt") as file:
   ...:     items = [item.split(',') for item in file.read().split('\n')[:-1]]
   ...:     

In [2]: items
Out[2]: 
[['Jane Fairfax', 'Letter'],
 ['Frank Churchill', 'Letter'],
 ['Emma Woodhouse', 'Letter'],
 ['Frank Churchill', 'Letter'],
 ['Harriet Smith', 'Package'],
 ['Emma Woodhouse', 'Letter'],
 ['Philip Elton', 'Package'],
 ['Emma Woodhouse', 'Package']]
然后,我们可以使用另一种理解来确定属于特定人的项目

In [3]: received = [kind for (name, kind) in items if name == recipient]

In [4]: received
Out[4]: ['Letter', 'Letter', 'Package']
然后,我们可以使用
计数器
来计算收到的每个项目的数量

In [5]: from collections import Counter

In [6]: Counter(received)
Out[6]: Counter({'Letter': 2, 'Package': 1})

In [7]: totals = dict(Counter(received))

In [8]: totals
Out[8]: {'Letter': 2, 'Package': 1}
最后,我们可以使用
for
循环以所需的格式显示此内容

In [9]: print("Name:", recipient)
   ...: for (item, count) in totals.items():
   ...:     print(count, item)
   ...:     
Name: Emma Woodhouse
2 Letter
1 Package

首先,我们可以使用列表理解来解析文件本身

In [1]: with open("mail.txt") as file:
   ...:     items = [item.split(',') for item in file.read().split('\n')[:-1]]
   ...:     

In [2]: items
Out[2]: 
[['Jane Fairfax', 'Letter'],
 ['Frank Churchill', 'Letter'],
 ['Emma Woodhouse', 'Letter'],
 ['Frank Churchill', 'Letter'],
 ['Harriet Smith', 'Package'],
 ['Emma Woodhouse', 'Letter'],
 ['Philip Elton', 'Package'],
 ['Emma Woodhouse', 'Package']]
然后,我们可以使用另一种理解来确定属于特定人的项目

In [3]: received = [kind for (name, kind) in items if name == recipient]

In [4]: received
Out[4]: ['Letter', 'Letter', 'Package']
然后,我们可以使用
计数器
来计算收到的每个项目的数量

In [5]: from collections import Counter

In [6]: Counter(received)
Out[6]: Counter({'Letter': 2, 'Package': 1})

In [7]: totals = dict(Counter(received))

In [8]: totals
Out[8]: {'Letter': 2, 'Package': 1}
最后,我们可以使用
for
循环以所需的格式显示此内容

In [9]: print("Name:", recipient)
   ...: for (item, count) in totals.items():
   ...:     print(count, item)
   ...:     
Name: Emma Woodhouse
2 Letter
1 Package

你很接近。你想使用你创建的字典来记录你读过的所有名字以及每个人收到的邮件类型。以下是我的想法:

tenants = {}

def print_mail(name):
    if name in tenants:
        print 'Name: {}'.format(name)
        print '{} Letters'.format(tenants[name]['Letter'])
        print '{} Packages'.format(tenants[name]['Package'])
    else:
        print 'Name not found'

def read_mail_file():
    # Using the with statement creates a file object and 
    # automatically closes it for you when the statement exits
    with open('mail.txt', 'r') as infile:
        for line in infile.readlines():
            # Convert the line into an array split by commas
            line = line.strip().split(',')
            name = line[0]
            mail_type = line[1]

            # If you have not already seen this person then
            # create an embedded dictionary to keep track of their mail
            if name not in tenants:
                tenants[name] = {'Letter': 0, 'Package': 0}

            # Then, just update the type of mail they received on this
            # line
            tenants[name][mail_type] += 1

if __name__ == "__main__":
    read_mail_file()
    print_mail('Emma Woodhouse')

你很接近。你想使用你创建的字典来记录你读过的所有名字以及每个人收到的邮件类型。以下是我的想法:

tenants = {}

def print_mail(name):
    if name in tenants:
        print 'Name: {}'.format(name)
        print '{} Letters'.format(tenants[name]['Letter'])
        print '{} Packages'.format(tenants[name]['Package'])
    else:
        print 'Name not found'

def read_mail_file():
    # Using the with statement creates a file object and 
    # automatically closes it for you when the statement exits
    with open('mail.txt', 'r') as infile:
        for line in infile.readlines():
            # Convert the line into an array split by commas
            line = line.strip().split(',')
            name = line[0]
            mail_type = line[1]

            # If you have not already seen this person then
            # create an embedded dictionary to keep track of their mail
            if name not in tenants:
                tenants[name] = {'Letter': 0, 'Package': 0}

            # Then, just update the type of mail they received on this
            # line
            tenants[name][mail_type] += 1

if __name__ == "__main__":
    read_mail_file()
    print_mail('Emma Woodhouse')
这是你的解决方案

import collections
y=[]
with open('mail.txt') as infile:
    counts = collections.Counter(l.strip() for l in infile)
for line, count in counts.most_common():
    y.append(line + ',' + str(count))
line=input("Name: ")
for i in y:
    if line == str(i).split(',')[0]:
        print(str(i).split(',')[2] + ' ' + str(i).split(',')[1])
这是你的解决方案

import collections
y=[]
with open('mail.txt') as infile:
    counts = collections.Counter(l.strip() for l in infile)
for line, count in counts.most_common():
    y.append(line + ',' + str(count))
line=input("Name: ")
for i in y:
    if line == str(i).split(',')[0]:
        print(str(i).split(',')[2] + ' ' + str(i).split(',')[1])

我投票将此问题作为离题题结束,因为SO不是家庭作业完成服务。我投票将此问题作为离题结束,因为SO不是家庭作业完成服务。