在Python中的字典值中计算列表中各种项目的出现次数

时间:2014-11-30 11:32:27

标签: python list dictionary count

以下内容读取包含以下条目的文本文件:

Emma Woodhouse,Package
Emma Woodhouse,Letter
Emma Woodhouse,Letter

我已将文本转换为列表以将其拆分为逗号,然后创建一个词典以将每个人作为键并将每个项目作为值传递给他们。所以下面的代码会产生:

{'Emma Woodhouse': ['Letter', 'Letter', 'Package']}

我的问题在于计算每种类型项目的出现次数,因此当用户使用“艾玛·伍德豪斯”查询字典时,我希望它能够打印出来:

2 Letters
1 Package

在我遇到大于1(!)的多个条目的问题之前,我很难根据需要获取信息。任何帮助将不胜感激!

mail_list = []

for entry in open ('mail.txt'):
  listed = entry.strip().split(',')
  mail_list.append(listed) 

import collections

mail_dict = collections.defaultdict(list)
for person, package in mail_list:
  mail_dict[person].append(package)

name = input('Name: ')

for name in mail_dict:
  for item in mail_dict.values():
    count = 0
    for individual in item: 
      count += 1
    print(count, individual)

我知道上面的内容很可能非常丑陋' - 请多多包涵!它打印太多行和错误的总数:/

4 个答案:

答案 0 :(得分:2)

您可以使用Counter模块中的collections

In [1]: from collections import Counter

In [2]: mail_dict = {'Emma Woodhouse': ['Letter', 'Letter', 'Package']}

In [3]: [Counter(mail_dict[key]) for key in mail_dict]
Out[3]: [Counter({'Letter': 2, 'Package': 1})]

答案 1 :(得分:1)

尝试使用列表方法count

a = [1, 1, 1, 2, 2, 3, 4, 4, 4,]

a.count(1) == 3
a.count(2) == 2
a.count(3) == 3
a.count(4) == 3

您还需要使用name中的input('Name: ')来访问字典,而不是迭代它:

name = input('Name: ')

for item_list in mail_dict[name]:
    # count items

答案 2 :(得分:0)

这对我有用,试一试

import collections
def parse(mail_dict):
         return {i:dict(collections.Counter(mail_dict[i])) for i in mail_dict.keys()}

答案 3 :(得分:0)

这是我的方法:

import sys
file = open(sys.argv[-1], "r").read()
wordictionary={}
for word in file.split():
    if word not in wordictionary:
        wordictionary[word] = 1
    else:
        wordictionary[word] += 1
sortable = [(wordictionary[key], key) for key in wordictionary]
sortable.sort()
sortable.reverse()
for member in sortable: print (member)