第22号工程打错电话了

2024-05-16 10:11:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我不熟悉Python和机器学习。我试图解决Project Euler #22问题,它需要从每个名称中获取字母值,并与其字母位置相乘。 正确答案是871198282,但我一直得到823763619

我已经检查了包含名称的.txt文件。它们看起来不错,导入的名称文件没有任何问题。我已经一步一步地检查了代码。当我单独调用给定名称中的任何名称时,我的函数会给我正确的数字,例如,COLIN,它会给我49714。 然后我认为我的主体是错误的,我把所有的数字组合在一起,但是对我来说它看起来很好

你能给我一些我必须仔细看的线索吗? 此外,我知道我的代码看起来像一个noob,我可以为我的代码升级到下一个级别提出任何建议吗

事先非常感谢

# Using names.txt (right click and 'Save Link/Target As...'), a 46K text file containing over five-thousand first names, 
# begin by sorting it into alphabetical order. Then working out the alphabetical value for each name, multiply this value 
# by its alphabetical position in the list to obtain a name score.

# For example, when the list is sorted into alphabetical order, COLIN, which is worth 3 + 15 + 12 + 9 + 14 = 53, 
# is the 938th name in the list. So, COLIN would obtain a score of 938 × 53 = 49714.

# What is the total of all the name scores in the file?

import os
import pandas as pd
import numpy as np

total_counts = []

path ='C:\\python_practice_data'
file_path = os.path.join(path, 'name.txt')
name_list = pd.read_csv(file_path)
name_list=list(name_list)
name_list.sort()

def counts(name):
    _alphabet = {
        'A': 1,
        'B': 2,
        'C': 3,
        'D': 4,
        'E': 5,
        'F': 6,
        'G': 7,
        'H': 8,
        'I': 9,
        'J': 10,
        'K': 11,
        'L': 12,
        'M': 13,
        'N': 14,
        'O': 15,
        'P': 16,
        'Q': 17,
        'R': 18,
        'S': 19,
        'T': 20,
        'U': 21,
        'V': 22,
        'W': 23,
        'X': 24,
        'Y': 25,
        'Z': 26              
    }

    total = 0
    cha_name=[]

    for i in range(len(name_list)): 

        if name in name_list[i]:
            cha_name = list(name)
            print(cha_name)

            for j in range(len(cha_name)):
                if cha_name[j] in _alphabet:
                    total += _alphabet[cha_name[j]]
                    #print(total)
                else:
                    break

            return total
#Count the name in alphabericl order
def numbering(name):
    for i in range(len(name_list)):

        if name in name_list[i]:
            #print(i+1)
            break

        else: 
            continue

    return i+1    

#Main
for i in range(len(name_list)):
    name = name_list[i]
    total_numbers = numbering(name)*counts(name)
    total_counts.append(total_numbers)
    print(sum(total_counts))

Tags: thepathnamein名称forlenis
1条回答
网友
1楼 · 发布于 2024-05-16 10:11:33

您的代码有点长,需要解包的内容太多,无法涵盖这里的所有内容,但这里有一些注释

关于counts函数:

  • 似乎目标是对名称的字符值的总和求和,a=1,B=2,等等。;所以“科林”(作为“科林”)应该是53岁
  • 您引用了name_list,但实际上除了检查name是否在列表中之外,您不使用它,但这与函数的功能无关
  • 您有一个详细的字母表枚举,为每个字母分配一个数字,但有一些标准函数可以为您完成这一任务

你的count函数的一个短得多的版本:

def count(name):
    return sum([ord(ch)-64 for ch in name.upper()])

这将计算name中所有字符的字符值列表的总和。它调用name.upper()以确保名称中的所有字母都转换为大写。它使用ord(ch)来获得每个字符的序数值-ord('A')是65,ord('B')是66,等等,所以它减去64得到A=1,B=2,等等

代码的其余部分应该: -读取输入文件(假定名称唯一,没有重复) -按字母顺序排序 -使用结果列表为列表中的每个名称计算其在列表中的位置乘以用count计算的字符值 -将所有姓名的总数相加

关于numbering函数:

  • 它实际上什么都不做,只是以一种非常迂回的方式返回名称的总数
  • 我想你打算做的是计算一个名字在名字列表中的位置

同样,这只需要一行代码:

number = name_list.index(name)

每个列表都有一个方法,它只告诉您列表中某个值的索引是什么。因此,如果'Colin'是列表上的编号938,name_list.index('COLIN')将返回938

最后,您可以使用pandas来读取文件,但由于您不使用DataFrame或任何其他特定于pandas的数据结构,并且只需要列表中的所有内容,因此您可以同样轻松地使用内置Python库,因为它不是一个真正的.csv文件,而只是一个带有名称的纯文本文件

然后,整个程序会变成类似于:

def count(name):
    return sum([ord(ch)-64 for ch in name.upper()])


with open('C:\\python_practice_data\\name.txt', 'r') as f:
    name_list = sorted(f.read().split())
    result = sum([count(name) * (name_list.index(name) + 1) for name in name_list])
    print(result)

注意:将1添加到name_list.index(name),因为index从0开始,但是名字可能应该在位置1,而不是0

或者,如果你不喜欢所谓的列表理解的速记法:

def count(name):
    result = 0
    for ch in name.upper():
        result += ord(ch)-64
    return result


with open('C:\\python_practice_data\\name.txt', 'r') as f:
    name_list = sorted(f.read().split())
    result = 0
    for name in name_list:
        result += count(name) * (name_list.index(name) + 1)
    print(result)

这里没有使用真正高级的东西,不需要外部库

相关问题 更多 >