【问题标题】:Counting the most frequent word in a list计算列表中出现频率最高的单词
【发布时间】:2017-03-18 20:53:19
【问题描述】:

我正在尝试构建一个程序,如果用户输入姓名,它将返回具有该姓名的人数。如果他们键入“最”,它将返回使用最多的名称。我不知何故得到了计算单个单词的部分,但我不确定如何让程序定义和计算最常出现的单词。

import re
from collections import Counter

data = ('Billy Bob', 'Misty', 'Leroy', 'Leroy', 'Leroy', 'Billy Bob', 'Betty Sue',
        'Billy Bob', 'Betty Sue', 'Misty', 'Betty Sue', 'Betty Sue',
        'Misty', 'Betty Sue', 'Horace', 'Misty', 'Betty Sue', 'Misty',
        'Leroy', 'Betty Sue', 'Misty', 'Doug', 'Misty', 'Wilma', 'Jesse',
        'Misty', 'Billy Bob', 'Betty Sue', 'Betty Sue', 'Leroy', 'Misty',
        'Leroy', 'Jesse Jr', 'Betty Sue', 'Betty Sue', 'Misty', 'Misty',
        'Misty', 'Betty Sue', 'Misty', 'Misty', 'Misty', 'Leroy', 'Leroy',
        'Bailey', 'Peggy', 'Leroy', 'Billy Bob', 'Leroy', 'Leroy', 'Misty',
        'Paris', 'Leroy', 'Leroy', 'Misty Mae', 'Leroy', 'Misty', 'Leroy',
        'Bart', 'Big Daddy', 'Betty Sue', 'Billy Bob', 'Betty Sue',
        'LeeAnne', 'Billy Bob', 'Leroy', 'Betty Sue', 'Leroy', 'Betty Sue',
        'Misty', 'Rowdy', 'Billy Bob', 'Ricky', 'Misty', 'Billy Bob', 'Billy
        Bob', 'Billy Bob', 'EvaSue', 'Mark', 'Betty Sue', 'Leroy', 'Betty
        Sue', 'Billy Bob', 'Leroy', 'Leroy', 'Billy Bob', 'Billy Bob',
        'Billy Bob', 'Billy Bob', 'Billy Bob', 'Misty', 'Rob', 'Betty Sue',
        'SuelySue', 'Billy Bob', 'Misty', 'Betty Sue', 'Misty', 'Billy Bob',
        'Betty Sue', 'Leroy', 'Misty', 'Billy Bob', 'Misty', 'Misty', 'Billy
        Bob', 'Billy Bob', 'Billy Bob', 'Billy Bob', 'Leroy', 'Jesse Jr Jr',
        'Billy Bob', 'Grady', 'Leroy', 'Billy Bob', 'Leroy', 'Billy Bob',
        'Betty Sue', 'Billy Bob', 'Misty', 'Louise', 'Leroy', 'Betty Sue',
        'Leroy', 'Betty Sue', 'Leroy', 'Betty Sue', 'Betty Sue', 'Billy
        Bob', 'Leroy', 'Jenny Jae', 'Misty', 'Betty Sue', 'Billy Bob',
        'Leroy', 'Billy Bob', 'Jesse', 'Misty', 'Misty', 'Leroy', 'Betty
        Sue', 'BJ', 'Misty', 'Leroy', 'Boris', 'Misty', 'Billy Bob', 'Pegs',
        'Misty', 'Leslie', 'James', 'Melvin', 'Misty', 'Betty Sue', 'Mary
        Beth', 'Billy Bob', 'Betty Sue', 'Billy Bob', 'Misty', 'Betty Sue',
        'Leroy', 'Billy Bob', 'Billy Bob', 'BethAnne', 'Leroy', 'Betty Sue',
        'Bett', 'Billy Bob', 'Misty', 'Misty', 'Billy Bob', 'Leroy', 'Billy
        Bob', 'Billy Bob', 'Misty', 'Billy Bob', 'Raina', 'Betty Sue',
        'Misty', 'Misty', 'Misty', 'Betty Sue', 'Mikey', 'Betty Sue', 'Billy
        Bob', 'Misty', 'Betty Sue', 'Leroy', 'Betty Sue', 'Billy Bob',
        'Betty Sue', 'Billy Bob', 'Betty Sue', 'Louise Jr', 'Billy Bob',
        'Misty', 'Leroy', 'Leroy', 'Billy Bob', 'Billy Bob', 'Misty',
        'Leroy', 'Leroy', 'Leroy', 'Billy Bob', 'Betty Sue', 'Billy Bob',
        'Betty Sue', 'Misty', 'Betty Sue', 'Betty Sue', 'Misty', 'Betty
        Sue', 'Horace', 'Misty', 'Betty Sue', 'Misty', 'Leroy', 'Betty Sue',
        'Misty', 'Doug', 'Misty', 'Wilma', 'Jesse', 'Misty', 'Billy Bob',
        'Betty Sue', 'Betty Sue', 'Leroy', 'Misty', 'Leroy', 'Jesse Jr',
        'Betty Sue', 'Betty Sue', 'Misty', 'Misty', 'Misty', 'Betty Sue',
        'Misty', 'Misty', 'Misty', 'Leroy', 'Leroy', 'Bailey', 'Peggy',
        'Leroy', 'Billy Bob', 'Leroy', 'Leroy', 'Misty', 'Paris', 'Leroy',
        'Leroy', 'Misty Mae', 'Leroy', 'Misty', 'Leroy', 'Bart', 'Big
        Daddy', 'Betty Sue', 'Billy Bob', 'Betty Sue', 'LeeAnne', 'Billy
        Bob', 'Leroy', 'Betty Sue', 'Leroy', 'Betty Sue', 'Misty', 'Rowdy',
        'Billy Bob', 'Ricky', 'Misty', 'Billy Bob', 'Billy Bob', 'Billy
        Bob', 'EvaSue', 'Mark', 'Betty Sue', 'Leroy', 'Betty Sue', 'Billy
        Bob', 'Leroy', 'Leroy', 'Billy Bob', 'Billy Bob', 'Billy Bob',
        'Billy Bob', 'Billy Bob', 'Misty', 'Rob', 'Betty Sue', 'SuelySue',
        'Billy Bob', 'Misty', 'Betty Sue', 'Misty', 'Billy Bob', 'Betty
        Sue', 'Leroy', 'Misty', 'Billy Bob', 'Misty', 'Misty', 'Billy Bob',
        'Billy Bob', 'Billy Bob', 'Billy Bob', 'Leroy', 'Jesse Jr Jr',
        'Billy Bob', 'Grady', 'Leroy', 'Billy Bob', 'Leroy', 'Billy Bob',
        'Betty Sue', 'Billy Bob', 'Misty', 'Louise', 'Leroy', 'Betty Sue',
        'Leroy', 'Betty Sue', 'Leroy', 'Betty Sue', 'Betty Sue', 'Billy
        Bob', 'Leroy', 'Jenny Jae', 'Misty', 'Betty Sue', 'Billy Bob',
        'Leroy', 'Billy Bob', 'Jesse', 'Misty', 'Misty', 'Leroy', 'Betty
        Sue', 'BJ', 'Misty', 'Leroy', 'Boris', 'Misty', 'Billy Bob', 'Pegs',
        'Misty', 'Leslie', 'James', 'Melvin', 'Misty', 'Betty Sue', 'Mary
        Beth', 'Billy Bob', 'Betty Sue', 'Billy Bob', 'Misty', 'Betty Sue',
        'Leroy', 'Billy Bob', 'Billy Bob', 'BethAnne', 'Leroy', 'Betty Sue',
        'Bett', 'Billy Bob', 'Misty', 'Misty', 'Billy Bob', 'Leroy', 'Billy
        Bob', 'Billy Bob', 'Misty', 'Billy Bob', 'Raina', 'Betty Sue',
        'Misty', 'Misty', 'Misty', 'Betty Sue', 'Mikey', 'Betty Sue', 'Billy
        Bob', 'Misty', 'Betty Sue', 'Leroy', 'Betty Sue', 'Billy Bob',
        'Betty Sue', 'Billy Bob', 'Betty Sue', 'Louise Jr', 'Billy Bob',
        'Misty', 'Leroy', 'Leroy', 'Billy Bob', 'Billy Bob', 'Betty Sue')

print('''Welcome to the White Valley Name Counter. Enter a name, or "most" to see what name is the most used in this great city!''')

print()
keepgoing = 'y'

while keepgoing == 'y':
    count = 0
    search = input("What name do you want to search for in White Valley database? ")
    print()
    data_list = list(data)
    if search != "most":
        print("There are {} people named {}".format(data_list.count(search),search))
        print()
    elif search == "most":
        print("{} is the most common. There are {} of them".format(
                data_list.count.most_common(data_list), search))
    keepgoing = input('''Want to search another name ("y" for yes)? ''')
    print()

我正在尝试使输出看起来像这样:

Welcome to the White Valley Name Counter. Enter a name, or "most" to see what name is the most used in this great city!

What name do you want to search for in White Valley database? john

There are 0 people named john

Want to search another name ("y" for yes)? y

What name do you want to search for in White Valley database? Betty Sue

There are 79 people named Betty Sue

Want to search another name ("y" for yes)? y

What name do you want to search for in White Valley database? most

Billy Bob is most common. There are 93 of them

Want to search another name ("y" for yes)? n

【问题讨论】:

  • 用户应该如何搜索名为“most”的人?

标签: python loops for-loop count


【解决方案1】:

计算用户指定的名称出现的次数非常容易!

让我们编写一个小函数来处理它并返回结果。

names = ("billy","bob","pete","bob",'pete','bob');


def count_my_name(name):
    return ("The name %s occurs %s times." % (name,str(names.count(name))));

如果我们使用名称 pete 打印此结果,我们将得到以下结果:

The name pete occurs 2 times.

现在为了计算列表中最常见的名字,我们可以编写另一个简洁的小函数来处理它并为我们返回结果。

names = ("billy","bob","pete","bob",'pete','bob');
def get_most_common_name():
    all_names = set(names);
    most_common = max([names.count(i) for i in all_names]);
    for name in all_names:
        if names.count(name) == most_common:
            return ("The most common name is %s occuring a total of %s times." % (name,str(most_common)));

这会给我们结果:The most common name is bob occuring a total of 3 times.

好的,现在对我们的第二个函数进行一些解释,我们实际上在这里做什么?

首先我们获取命名为名称的元组,其中包含名称但其中一些是重复的,我们不想多次迭代同一个名称。 因此,创建一个名为 all_names 的新变量并从该列表中创建一个集合。

集合很有用,因为它们会为我们删除任何重复项。

现在我们可以使用以下方法计算名称中出现的次数:

most_common = max([names.count(i) for i in all_names]);

这为我们提供了在我们的元组中出现最多的名称的编号。 应该是 3。

现在我们只需遍历我们的集合 all_names 并计算该名称在名称中出现的次数。

如果名称在名称中出现的次数与我们的 most_common 变量一样多,我们就有出现次数最多的名称。

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    您可以为此使用计数器:

    import collections
    
    data = ('Billy Bob', 'Misty', …)
    counts = collections.Counter(data)
    
    # add an additional 'Misty'
    counts.update(['Misty'])
    
    # most seen name
    if counts:
        name, count = counts.most_common(1)[0]
        print("most common name is {} with a count of {}".format(name, count))
    else:
        print("no names available")
    
    name = "Billy Bob"
    count = counts.get(name)
    if count is not None:
         print("There are {} people named {}".format(count, name))
    else:
         print("There is no {}".format(name))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-27
      • 1970-01-01
      • 1970-01-01
      • 2014-12-28
      • 1970-01-01
      • 2013-12-20
      • 1970-01-01
      • 2013-12-28
      相关资源
      最近更新 更多