2013-11-04 139 views
4

我正在做一些功课,我卡住了。我应该在Python 3中编写一个代码,它读取一个文本文件,就像一个数字的账单。我应该编写代码,以便计算总量。乘以一个列表python

我觉得一个法案(简单的例子)将包含一个数字和一个奖项。像:

2 10$ 
1 10 $ 
and so on 

所以我想,我创建一个列表与所有数字,然后我要乘以第一与第二个元素的列表,然后在列表中跳跃所以tird和第四元素乘法等等,直到我的列表中没有更多的数字。在这种情况下,我希望每个乘法的总和在一个新的列表中被称为总和,然后它们将被求和。

我的代码看起来像这样至今:

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

你卡在哪里? – bozdoz

+1

将数字读入数字列表中可能不是解决此问题的最佳方法。你能想出一种以更多“表格”的方式来表示数字的方法吗?然后你可以遍历行,每行有两列:数量和价格。 – hankd

+0

在您的循环中发布帐单文件 – njzk2

回答

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

在你的代码的问题可能是你保持复位sums列表中的每一个数字。所以你基本上一直忘记你之前收集的款项。这同样适用于startnxt。如果将这些定义移到循环外部,并且将summor.append(t)修复为sums.append(t),它几乎可以工作。还要注意,循环变量n确实是而不是遍历了numbers的索引,而是遍历了实际项目(即数字)。所以最后n == len(numbers)的支票不太可能达到您的预期。相反,您可以将之后的打印放在循环中,因为您知道当您达到该点时,循环结束并且已查看所有数字。


一个常见的成语是使用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 
+0

1+最佳解决方案。 –

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) 

后来,在总结数&票据的乘法时,你可能不会需要一个list,而不是和整型变量应该是足够的。

sum = 0 
for num, bill in numbers: 
    sum += num * bill 
print("The total amount is", sum) 
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 

此外,您可能想从文件=打开( '的data.txt', 'R')的距离这需要你明确地关闭你的文件。使用open('data.txt','r')作为f:并且您的文件将隐式关闭。