我是这个社区和这种计算机语言的新手。最近我正在做一些练习,一个问题已经困扰了我好几天。这是一个问题: 在python中读取文件test.txt(索引:" CDEF"," ABC"," FIJK"),并将其重新对齐到" ABC&# 34;," CDEF"" FIJK" ,并给每个字符一个基于字母顺序的值(例如," ABC" = 1 + 2 + 3 = 6),最后打印索引的值 (例如,A + B + C = 6," ABC"在第一个位置代表1,因此" ABC"的值是6," CDEF"的值。是18 * 2 = 36(2表示列表的第二位)" FIJK"是36 * 3 = 108)打印150(6 + 36 + 108)
我现在没有代码。我想是否用字典键来做。但有没有什么好方法可以做到这一点,或者今天的文件不是上面的索引。我应该循环吗?
答案 0 :(得分:1)
首先,我们假设您有一个名为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
<强> SCRIPT 强>
这是完成(我认为)你所追求的目标的脚本:
lines: ['CDEF', 'ABC', 'FIJK']
lines sorted: ['ABC', 'CDEF', 'FIJK']
sums: [6, 18, 36]
products: [6, 36, 108]
total: 150
<强>输出强>
以上代码的输出:
so.txt
<强>说明强>
(1)打开file
作为只读文件,并将其存储为变量:with open('so.txt', 'r') as file:
。
file
(2)取 lines = [x.replace('\n', '') for x in file.readlines()]
中的每一行并删除任何换行符并将其转换为列表。
lines.sort()
(3)对列表进行排序。
sums = [sum([ord(letter.lower()) - 96 for letter in line]) for line in lines]
(4)这个有点棘手,因为它做了一些事情。
sums = [<do_something_here with line> for line in lines]
所以,让我们将其分解为两个部分:
lines
该代码称为list comprehension。它正在创建一个包含 sums = []
for line in lines:
sums.append(<do_something_here with line>)
列表的每个元素的新列表,并执行某些操作。它大致相当于:
line
因此,拥有 [ord(letter.lower()) - 96 for letter in line]
变量(这将是一个字符串),我们可以将其视为一个列表并在另一个列表理解中迭代它:
letter
对于line
字符串中的每个96
,它会将其转换为小写,使其成为ASCII序号,并减去a == 1
以使其以sum()
开头。您可以看到all ASCII numbers here的列表。
最后,如果列表现在是将字符串转换为数字,我们会将[6, 18, 36]
应用于该列表。
我们现在有:
sums
(5)我们获取index
的列表并提供另一个列表理解。这一次,目标是获取每个数字,并将其乘以list.index(element)
。您可以通过调用 products = [x * (sums.index(x) + 1) for x in sums]
来获取元素的索引。如下:
sum()
(6)最后,我们要做的就是再次使用 total = sum(products)
方法对最后一个列表求和。
-Onone
我希望我回答你所追问的问题。
答案 1 :(得分:0)
您可以使用嵌套理解:
>>> lst = ["ABC", "CDEF", "FIJK"]
>>> sum((idx + 1) * sum(ord(letter) - 64 for letter in item) for idx, item in enumerate(lst))
150
如果要对累加器使用常规for循环:
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"
中的每个字符生成一个数字,然后将它们相加。然后,此值会累积到total_sum
,在6
循环的第一次迭代后将包含for
。