2017-02-22 4 views
1

は私のプログラムは、このようなファイルの名前mail.txtに読んでください:は手紙の量をカウントし、人が受け取ったパッケージ - Pythonの

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 

私は次の続行する方法がわからない

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

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

これは私のコードです。なにか提案を?ありがとう。

+0

SOは宿題を修了していないため、この質問をトピックとしてクローズします。 – TigerhawkT3

答えて

-1

まず、リスト内包を使用してファイル自体を解析できます。

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'] 

Counterを使用して、受信した各アイテムの数をカウントできます。

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 
1

あなたはかなり近いです。作成したその辞書を使用して、読んだすべての名前と各自が受け取ったメールのタイプを追跡したいとします。ここに私が思いついたのがあります:

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') 
0

あなたの解決策はここにあります。

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]) 
関連する問題