我正在做一些功课而且我被困住了。我应该在Python 3中编写一个代码,它读取的文本文件就像是一个带有大量数字的账单。我应该编写代码,以便计算总金额。
我认为账单(简单示例)将包含一个数字和一个奖品。像:
2 10$
1 10 $
and so on
所以我想我创建了一个包含所有数字的列表,然后我想将第一个与列表中的第二个元素相乘,然后在列表中跳转,以便第三个和第四个元素相乘,依此类推,直到我的列表中没有更多数字。在这种情况下,我想要一个名为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))
答案 0 :(得分:10)
代码中的问题可能是您不断为列表中的每个号码重置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
如您所见,这将在迭代列表时自动对数字进行分组。所以现在你只需要收集这些款项:
>>> 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
答案 1 :(得分: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')作为f:并隐式关闭你的文件。
答案 2 :(得分:1)
首先,我想说,这是一次非常好的尝试。如果您不想被宠坏,除非您自己尝试更正/改进,否则不应阅读我编写的代码。 (我不是专业人士)
好吧,就像你说每行包含2个需要乘法的数字一样,你应该先逐行阅读&amp;不是个别数字,因为这可能会很麻烦。
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)
后来,当总结数字和&amp;的乘法时账单,你可能不需要list
,而是一个整数变量就足够了。
sum = 0
for num, bill in numbers:
sum += num * bill
print("The total amount is", sum)
答案 3 :(得分:0)
有几件事:
sums = []
位于循环for n in numbers
内。这意味着您每次都要重置sums
列表。你应该把它移到循环外面。start = 0
和nxt = start + 1
。现在,这些值会分别为列表中的每个数字重置为0
和1
。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))