Python中,重复计数名字

问题描述 投票:-2回答:1
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,其中关键是名字从关键的名单listand值/姓氏是时代的名称,或在该列表姓氏重复的ammount的。

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

这部分代码转换,其具有alist的一个列表,其中每个名字和姓氏在列表中分隔值的值name_list。这份名单与姓和名分开叫split。当我在这一点上检查代码,它的工作原理,它打印split和I T拥有所有分隔的名称和lastnames。

问题是,下面的代码犯规正确计算的重复名称或lastnames,功能仍然运行,但时代的名字和姓氏出现在列表中split是不正确的金额。问题是,在这部分代码:

dicti = {}
    for word in split:
        if word in dicti:
            dicti[word] +=1
        else:
            dicti[word] = 0

HALP

python
1个回答
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)的给你一套独特的名字,在这你再重复做计数。

而实际上,这里还有一个现成的-PEG计数字典,叫Counter,在Python的标准库:

import collections
def name_counts(alist):
    return collections.Counter(name for listitem in alist for name in listitem.split())
© www.soinside.com 2019 - 2024. All rights reserved.