我正在做一些功课,我被困住了.我应该在Python 3中编写一个代码,它读取的文本文件就像一个带有大量数字的账单.我应该编写代码,以便计算总金额.
我认为一个账单(简单示例)将包含一个数字和一个奖品.喜欢:
2 10$
1 10 $
and so on
Run Code Online (Sandbox Code Playgroud)
所以我想我创建了一个包含所有数字的列表然后我想将第一个与列表中的第二个元素相乘,然后在列表中跳转,这样第三个和第四个元素相乘,依此类推,直到有我的列表中没有更多数字.在这种情况下,我想要一个名为sums的新列表中的每个乘法的和,它们稍后将被求和.
我的代码到目前为止看起来像这样:
file = open('bill.txt')
s = file.read()
file.close()
numbers = []
garbage = []
for x in s.split():
try:
numbers.append(float(x))
except ValueEror:
garbage.append()
print(numbers)
for n in numbers:
sums = []
start = 0
nxt = start + 1
t = numbers[start]*numbers[nxt]
if n <= len(numbers):
start += 2
nxt += 2
summor.append(t)
if n == len(numbers):
print(sum(sums))
Run Code Online (Sandbox Code Playgroud)
pok*_*oke 11
您的代码中的问题可能是您继续重置sums列表中的每个数字.所以你基本上忘记了之前收集的金额.这同样适用于start和nxt.如果将这些定义的循环之外,同时也修复summor.append(t)到sums.append(t)它应该差不多工作.还要注意的是循环变量n并没有过度的指标迭代numbers,但在实际的项目(即数字).因此,最后的检查n == len(numbers)不太可能达到您的预期.相反,您可以在循环之后放置打印,因为您知道当您到达该点时循环结束并且所有数字都已被查看.
常用的习惯用法是zip将两个元素相互组合.通常,您在两个不同的迭代器或序列上使用zip,但您也可以在同一个迭代器上使用zip作为单个列表:
>>> numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> it = iter(numbers)
>>> for a, b in zip(it, it):
print(a, b)
1 2
3 4
5 6
7 8
Run Code Online (Sandbox Code Playgroud)
如您所见,这将在迭代列表时自动对数字进行分组.所以现在你只需要收集这些款项:
>>> sums = []
>>> it = iter(numbers)
>>> for a, b in zip(it, it):
sums.append(a * b)
>>> sum(sums)
100
Run Code Online (Sandbox Code Playgroud)
最后,您可以使用生成器表达式缩短一点:
>>> it = iter(numbers)
>>> sum(a * b for a, b in zip(it, it))
100
Run Code Online (Sandbox Code Playgroud)