[英]Python, counting repeated name
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())
这部分代码将具有name_list
值的alist
转换为一个列表,其中每个 name 和 lastname 是列表中的单独值。 这个名字和姓氏分开的列表称为split
。 当我此时检查代码时,它可以工作,它会打印split
并将所有名称和姓氏分开。
问题是以下代码没有正确计算重复名称或姓氏,函数仍然运行,但名称和姓氏出现在列表split
中的次数不正确。
问题出在这部分代码中:
dicti = {}
for word in split:
if word in dicti:
dicti[word] +=1
else:
dicti[word] = 0
帮助
计数减 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())
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.