需要在一个文件中找到使用最多的10个姓氏.做了一本字典,但剩下的还需要整理



我制作了一个姓氏词典,其中包含如下的姓氏:

文件包含200,000个单词,这是一个关于姓氏字典

的示例。
['KRISTIANSEN', 'OLDERVIK', 'GJERSTAD', 'VESTLY SKIVIK', 'NYMANN', 'ØSTBY', 'LINNERUD', 'REMLO', 'SKARSHAUG', 'ELI', 'ADOLFSEN']

我不允许使用计数器库或numpy,只能使用本机Python。我的想法是在字典中使用for循环排序,但是碰到了一些瓶颈。请帮忙提些建议。

谢谢。

surname_dict = []
count = 0
for index in data_list:
if index["lastname"] not in surname_dict:
count = count + 1
surname_dict.append(index["lastname"])

for k, v in sorted(surname_dict.items(), key=lambda item: item[1]):
if count < 10:  # Print only the top 10 surnames
print(k)
count += 1
else:
break

正如在评论中提到的,你的字典实际上是一个列表。

尝试使用集合库中的Counter对象。在下面的例子中,我编辑了你的列表,使它包含了一些重复的内容。

from collections import Counter
surnames = ['KRISTIANSEN', 'OLDERVIK', 'GJERSTAD', 'VESTLY SKIVIK', 'NYMANN', 'ØSTBY', 'LINNERUD', 'REMLO', 'SKARSHAUG', 'ELI', 'ADOLFSEN', 'OLDERVIK', 'ØSTBY', 'ØSTBY']
counter = Counter(surnames)
for name in counter.most_common(3):
print(name)

结果变成:

('ØSTBY', 3)
('OLDERVIK', 2)
('KRISTIANSEN', 1)

根据您的用例将整型参数most_common更改为10。

回答这个问题的最佳方法是考虑以下十大类别:例如:被使用9次的名称类别和被使用200次的名称类别等等。因为,我们可能有100个用户使用不同的用户名但他们都必须在前10名用户名中。因此,要实现我的方法,这里是脚本:

def counter(file : list):
L = set(file)
i = 0
M = {}
for j in L :
for k in file :
if j == k:
i+=1
M.update({i : j})
i = 0
D = list(M.keys())
D.sort()
F = {}
if len(D)>= 10:
K = D[0:10]
for i in K:
F.update({i:D[i]})
return F
else :
return M

注意:我的脚本计算了十大类别。

你可以把所有的值放在一个字典中,这个字典的值是它在数据集中出现的次数,并通过你新创建的字典进行过滤,并推送任何值为count>10到你的最终数组

编辑:你的surname_dict被初始化为一个数组,而不是一个字典。

surname_dict = {}
top_ten = []
for index in data_list:
if index['lastname'] not in surname_dict.keys():
surname_dict[index['lastname']] = 1
else:
surname_dict[index['lastname']] += 1
for k, v in sorted(surname_dict.items()):
if v >= 10:
top_ten.append(k)
return top_ten

使用标准字典。我已经为您的数据添加了一些副本,并且使用threshold值来抓取超过2次出现的任何名称。在实际代码中使用threshold = 10

names = ['KRISTIANSEN', 'OLDERVIK', 'GJERSTAD', 'VESTLY SKIVIK', 'NYMANN', 'ØSTBY','ØSTBY','ØSTBY','REMLO', 'LINNERUD', 'REMLO', 'SKARSHAUG', 'ELI', 'ADOLFSEN']
# you need 10 in your code, but I've only added a few dups to your sample data
threshold = 2
di = {}
for name in names:
#grab name count, initialize to zero first time
count = di.get(name, 0)
di[name] = count + 1

#basic filtering, no sorting
unsorted = {name:count for name, count in di.items() if count >= threshold}
print(f"{unsorted=}")

#sorting by frequency: filter out the ones you don't want
bigenough = [(count, name) for name, count in di.items() if count >= threshold]
tops = sorted(bigenough, reverse=True)
print(f"{tops=}")
#or as another dict
tops_dict = {name:count for count, name in tops}
print(f"{tops_dict=}")
输出:

unsorted={'ØSTBY': 3, 'REMLO': 2}
tops=[(3, 'ØSTBY'), (2, 'REMLO')]
tops_dict={'ØSTBY': 3, 'REMLO': 2}

更新想分享一下我最后写的代码。非常感谢你们。反馈真的很有帮助。

代码:

etternavn_dict = {}
for index in data_list:
if index['etternavn'] not in etternavn_dict.keys():
etternavn_dict[index['etternavn']] = 1
else:
etternavn_dict[index['etternavn']] += 1
print("nTopp 10 etternavn:")
count = 0
for k, v in sorted(etternavn_dict.items(), key=lambda item: item[1]):
if count < 10:
print(k)
count += 1
else:
break

最新更新