Python - 在读取文件后如何给出字符串值

时间:2016-07-27 04:03:42

标签: python linux python-2.7 ipython

我是这个社区和这种计算机语言的新手。最近我正在做一些练习,一个问题已经困扰了我好几天。这是一个问题: 在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)

我现在没有代码。我想是否用字典键来做。但有没有什么好方法可以做到这一点,或者今天的文件不是上面的索引。我应该循环吗?

2 个答案:

答案 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