4

我正在做一些功课,但我被困住了。我应该在 Python 3 中编写一个代码,它读取一个文本文件,该文件就像一张带有大量数字的账单。我应该编写代码,以便计算总金额。

我认为账单(简单示例)将包含一个数字和一个奖品。喜欢:

2 10$
1 10 $
and so on

所以我想我创建一个包含所有数字的列表,然后我想将第一个元素与列表中的第二个元素相乘,然后跳转到列表中,这样第三个元素和第四个元素就会相乘,依此类推,直到有我的列表中没有更多的数字。在这种情况下,我希望将每个乘法的总和放在一个名为 sum 的新列表中,然后将它们相加。

到目前为止,我的代码如下所示:

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))
4

4 回答 4

11

您的代码中的问题可能是您不断重置sums列表中的每个数字。所以你基本上一直忘记你以前收集的金额。这同样适用于startnxt。如果您将这些定义移到循环之外,并且还修复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

如您所见,这将在遍历列表时自动对数字进行分组。所以现在你只需要收集这些款项:

>>> sums = []
>>> it = iter(numbers)
>>> for a, b in zip(it, it):
        sums.append(a * b)

>>> sum(sums)
100

最后,您可以使用生成器表达式进一步缩短它:

>>> it = iter(numbers)
>>> sum(a * b for a, b in zip(it, it))
100
于 2013-11-04T18:43:09.753 回答
2

这可能是您输入时的拼写错误,但在您的第二行数据中,金额和 $ 之间有一个空格,而上一行没有空格。这将在剥离 $ 时导致一些问题。

尝试这个:

total = 0
with open('data.txt', 'r') as f:
    lines = f.readlines()
    amounts = []
    garbage = []
    for line in lines:
        try:
            multiples = line.split()
            multiplier = multiples[0]
            amount = multiples[1].strip('$\n')
            amounts.append(int(multiplier)*float(amount))
        except:
            garbage.append(line)
    total = sum(amounts)
print(total)

通过对输出或文本数据进行一些小的格式化,您应该能够获得所需的结果。这是我使用的txt数据:

2 10$
1 10$
3 20.00$

输出是:

90.0

此外,您可能希望摆脱 file = open('data.txt', 'r') 这需要您明确关闭文件。与 open('data.txt', 'r') as f: 一起使用,您的文件将被隐式关闭。

于 2013-11-04T18:52:19.247 回答
1

首先,我想说,相当不错的尝试。如果你不想被宠坏,你不应该阅读我写的代码,除非你自己尝试更正/改进。(我不是专业人士)

好吧,就像您说的每行包含需要相乘的 2 个数字,您应该从逐行阅读而不是单个数字开始,因为这可能会很麻烦。

file = open('bill.txt')
s = file.readlines()
file.close()

numbers = []
garbage = []

for line in s:
    try:
        line.strip('$') # removes the trailing $ sign for easy number extraction
        numbers.append(map(int, line.split()))
    except ValueEror:
        garbage.append(line)
print(numbers)

稍后,当总结数字和账单的乘法时,您可能不需要 a list,而是一个 sum 整数变量就足够了。

sum = 0
for num, bill in numbers:
    sum += num * bill
print("The total amount is", sum)
于 2013-11-04T18:49:01.410 回答
0

几件事:

  • sums = []在循环内for n in numbers。这意味着您sums每次都在重置列表。你应该把它移到循环之外。
  • 这同样适用于start = 0nxt = start + 1。这些值现在不断被重置为列表01的每个数字。
  • 你在比较if n <= len(numbers):,但什么是n?这是您的数字列表中的实际值,它不代表列表中的位置。您应该将其替换为while start < len(numbers):- 只要起始位置仍在我们应该继续进行的列表中。这也意味着您可以n从代码中删除。

代码现在变为:

sums = []
start = 0
nxt = start + 1
while start < len(numbers):
    t = numbers[start]*numbers[nxt]    
    start += 2
    nxt += 2
    sums.append(t)

print(sum(sums))
于 2013-11-04T18:42:38.890 回答