我对这个社区和这个计算机语言很陌生。 最近我正在做一些练习,一个问题困扰了我好几天。 这里是一个问题:在Python中读取文件test.txt(index:“CDEF”,“ABC”,“FIJK”),并重新alignment到“ABC”,“CDEF”,“FIJK”,并给出每个字符(例如“ABC”= 1 + 2 + 3 = 6),最后打印索引值(例如A + B + C = 6,所以“ABC”的值是6,“CDEF”的值是18 * 2 = 36(2表示列表的第二位)“FIJK”是36 * 3 = 108)打印出150(6 + 36 + 108 )
我现在没有代码。 我正在考虑如果我用字典键来做。 但有没有什么好办法做到这一点,或者如果今天的文件不是上面的索引。 我应该循环吗?
首先,我们假设您有一个名为sample.txt
的文件,其中包含以下内容:
CDEF ABC FIJK
脚本
这里是脚本来完成(我认为)你在之后:
with open('so.txt', 'r') as file: lines = [x.replace('\n', '') for x in file.readlines()] print "lines: ", lines lines.sort() print "lines sorted: ", lines sums = [sum([ord(letter.lower()) - 96 for letter in line]) for line in lines] print "sums: ", sums products = [x * (sums.index(x) + 1) for x in sums] print "products: ", products total = sum(products) print "total: ", total
OUTPUT
以上代码的输出:
lines: ['CDEF', 'ABC', 'FIJK'] lines sorted: ['ABC', 'CDEF', 'FIJK'] sums: [6, 18, 36] products: [6, 36, 108] total: 150
说明
(1)打开so.txt
作为只读文件,并将其存储为变量: file
。
with open('so.txt', 'r') as file:
(2)取出file
每一行,并删除任何换行符并将其变成列表。
lines = [x.replace('\n', '') for x in file.readlines()]
(3)对列表进行排序。
lines.sort()
(4)这是一个有点棘手,因为它正在做一些事情。
sums = [sum([ord(letter.lower()) - 96 for letter in line]) for line in lines]
所以,我们分成两个部分:
sums = [<do_something_here with line> for line in lines]
该代码被称为列表理解 。 它正在用lines
列表的每个元素创建一个新列表,并做一些事情。 这大致相当于:
sums = [] for line in lines: sums.append(<do_something_here with line>)
因此,有了line
变量(这将是一个字符串),我们可以把它当作一个列表,并在另一个列表理解中迭代它:
[ord(letter.lower()) - 96 for letter in line]
对于字符串中的每个letter
,它将其转换为小写字母,使其成为一个ASCII序数,然后减去96
以使它以a == 1
开始。 你可以在这里看到所有ASCII码的列表。
最后,有一个列表,现在字符串转换为数字,我们应用sum()
到该列表。
我们现在有:
[6, 18, 36]
(5)我们把这个清单拿出来,提供另一个清单的理解。 这一次,我们的目标是把每个数字,乘以它的index
。 你可以通过调用list.index(element)
来得到一个元素的索引。 如下:
products = [x * (sums.index(x) + 1) for x in sums]
(6)最后,我们所要做的就是再次使用sum()
方法求和最后一个列表。
total = sum(products)
我希望我回答你以后的问题。
你可以使用嵌套的理解:
>>> lst = ["ABC", "CDEF", "FIJK"] >>> sum((idx + 1) * sum(ord(letter) - 64 for letter in item) for idx, item in enumerate(lst)) 150
如果你想用一个累加器使用正则循环:
total_sum = 0 for idx, item in enumerate(lst): total_sum += (idx + 1) * sum(ord(letter) - 64 for letter in item) print(total_sum)
ord("A")
给你一个字符的ascii值。 "A"
是65
。 这就是为什么我在例子中减去64
。 因此, (ord(letter) - 64 for letter in item)
"ABC"
中的每个字符,例如(ord(letter) - 64 for letter in item)
,然后将它们相加。 然后这个值被累加到total_sum
,在for
循环的第一次迭代之后它将包含6
。