【问题标题】:Python -- how do I give a string value after I read the filePython——读取文件后如何给出字符串值
【发布时间】:2016-11-30 21:46:10
【问题描述】:

我是这个社区和这种计算机语言的新手。最近我正在做一些练习,一个问题困扰了我好几天。这是问题: 在python中读取文件 test.txt(index: "CDEF","ABC","FIJK") ,并将其重新对齐为 "ABC","CDEF","FIJK" ,并根据字母给每个字符一个值order(eg, "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)

我现在没有代码。我正在考虑是否使用字典键来执行此操作。但是有什么绝妙的方法可以做到这一点,或者今天的文件不是上面的索引。我应该循环执行吗?

【问题讨论】:

  • 您不需要字典。列表是您的朋友。并且,特别是搜索“列表理解”。这就是你想要的。欢迎来到社区。您是在寻找有关如何完成此操作的代码,还是只是有关如何开始的建议?
  • 嗨! @Ahop。如果它不会打扰你。我希望也许我能得到一些示例代码。也许它可以重定向我。谢谢!

标签: python linux python-2.7 ipython


【解决方案1】:

首先,假设您有一个名为 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

输出

以上代码的输出:

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) 取出@​​987654330@ 中的每一行并删除所有换行符并将其变成一个列表。

    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]

该代码称为list comprehension。它正在使用lines 列表的每个元素创建一个新列表,并做一些事情。大致相当于:

    sums = []
    for line in lines:
        sums.append(<do_something_here with line>)

因此,有了line 变量(这将是一个字符串),我们也可以将其视为一个列表并在另一个列表理解中对其进行迭代:

    [ord(letter.lower()) - 96 for letter in line]

对于line 字符串中的每个letter,它将其转换为小写,使其成为ASCII 序数,并减去96 使其以a == 1 开头。可以看到all ASCII numbers here的列表。

最后,有了一个现在将字符串转换为数字的列表,我们将sum() 应用于该列表。

我们现在有:

[6, 18, 36]

(5) 我们采用sums 的列表并提供另一个 列表理解。这一次,目标是获取每个数字,并将其乘以它的index。您可以通过调用list.index(element) 来获取元素的索引。如下:

    products = [x * (sums.index(x) + 1) for x in sums]

(6) 最后,我们要做的就是再次将我们使用sum() 方法创建的最后一个列表相加。

    total = sum(products)

我希望我回答了你想要的问题。

【讨论】:

  • 感谢您的教程!!现在我彻底知道如何正确使用列表推导了。你才是真正的 MVP!
  • :-) 很高兴为您提供帮助。当我弄清楚它们时,我记得自己,它向我打开了 python 的世界。如果你喜欢这个答案,你可以点击复选框接受它。
  • @Ahop 在第4步,是不是一定要把信转入下层? [ord(letter()) - 64 for letter in line] 和你做的一样吗?
  • 是的。我只是把它调低了,以便代码更易于重用,并且可以处理不同的文件,无论大小写。你可以使用 .upper() 来达到同样的效果。
【解决方案2】:

您可以使用嵌套推导:

>>> 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 中,在for 循环的第一次迭代之后将包含6

【讨论】:

  • 感谢您的回答。但是如何循环编写呢?
猜你喜欢
  • 1970-01-01
  • 2016-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多