簡體   English   中英

遍歷python字符串中的字符並求和它們的值

[英]Iterating through characters in a python string and summing their values

所以我有一個非常簡單的任務。 Project Euler問題名稱分數為我們提供了一個包含一組字符串(即名稱)的文件。 現在,您必須按字母順序對這些名稱進行排序,然后為這些名稱中的每個名稱計算所謂的名稱分數並將它們加起來。 名稱分數的計算非常簡單。 您所要做的就是取一個名稱,然后對名稱中的字母值求和,然后將該總和乘以名稱在列表中的位置。 顯然,這似乎是一個非常簡單的問題。

作為python初學者,我想在python上嘗試一下,而作為初學者,這就是我寫的代碼。 我確實也使用了列表推導以及總和,但這給了我相同的答案。 這是我的代碼:

def name_score(s):
    # print sum((ord(c)-96) for c in s)
    s1 = 0;
    for c in s:
        s1 = s1 + (ord(c) - 96)
        print s1
    return s1
#         print ord(c) - 96

myList = []
f = open('p022_names.txt')

for line in f:
    myList.append(line.lower())

count = 0;
totalSum = 0;
for line in sorted(myList):
    count = count + 1;
    totalSum += (name_score(line) * count)
print totalSum

現在,文件p022_names.txt僅包含一行“ colin”。 因此,函數name_score(“ colin”)應該返回53。現在嘗試執行我總是最終得到-33的值。 我在Eclipse上使用PyDev。 現在這是一個奇怪的異常。 如果我只是使用列表變量,並在代碼中將其填充為值myList = [“ colin”],則將得到正確的答案。 老實說,我不知道發生了什么。 任何人都可以對這里發生的事情有所了解。 程序中也有一個類似的循環來計算totalSum,但這似乎沒有問題。

[編輯]指出問題后,我正在發布有效的代碼的更新版本。

def name_score(s):
    return sum((ord(c)-96) for c in s)


with open('p022_names.txt') as f:
    myList = f.read().splitlines()

print sum((name_score(line.lower()) * (ind+1)) for ind,line in enumerate(sorted(myList)))
96 - 53 - 33 = 10

發生這種情況是因為文件中包含換行符( "\\n" ),因此line不是"colin"而是"colin\\n"

為了擺脫換行符,可以使用多種方法。 這是一個例子:

替換行:

for line in f:

與:

for line in f.read().splitlines():

可能是因為您沒有關閉文件嗎? f.close()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM