在列表python中相乘

时间:2013-11-04 18:31:02

标签: python list

我正在做一些功课而且我被困住了。我应该在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))

4 个答案:

答案 0 :(得分:10)

代码中的问题可能是您不断为列表中的每个号码重置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

答案 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 = 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))