Python,计算重复的名称

时间:2019-02-02 23:38:23

标签: python

def name_counts(alist):
    split = []
    for listitem in alist:
        split.extend(listitem.split())
    dicti = {}
    for word in split:
        if word in dicti:
            dicti[word] +=1
        else:
            dicti[word] = 0
    print(split)
    return dicti


name_list = ["David Joyner", "David Zuber", "Brenton Joyner",
             "Brenton Zuber", "Nicol Barthel", "Shelba Barthel",
             "Shelba Crowley", "Shelba Fernald", "Shelba Odle",
             "Shelba Fry", "Maren Fry"]
print(name_counts(name_list))

此函数应返回字典dicti,其中键是列表list中的名称/姓氏,而键的值是名称或姓氏在该列表中重复的次数。

def name_counts(alist):
        split = []
        for listitem in alist:
            split.extend(listitem.split())

这部分代码将值alist的{​​{1}}转换为一个列表,其中每个名称和姓氏都是列表中的单独值。名称和姓氏分开的列表称为name_list。当我此时检查代码时,它可以工作,它将打印split,并且所有名称和姓氏都将分隔开。

问题是以下代码无法正确计算重复的名称或姓氏,功能仍然运行,但是名称和姓氏出现在列表split中的次数不正确。问题出在这部分代码中:

split

半个

1 个答案:

答案 0 :(得分:3)

计数减少1,因为第一次看到名称时,会将名称的计数初始化为0。如果要保留当前的流控制结构,则应在该位置将计数初始化为1。点而不是0。

但这是一个更紧凑的版本,可以避免引起您误入歧途:

def name_counts(alist):
    split = [name for listitem in alist for name in listitem.split()]
    return {name : split.count(name) for name in set(split)}

请注意使用set(split)为您提供一组唯一名称,然后您可以在其上重复进行计数。

实际上,Python的标准库中还有一个现成的计数字典,称为Counter

import collections
def name_counts(alist):
    return collections.Counter(name for listitem in alist for name in listitem.split())