在Python中对列表进行乘法运算

4

我是一名有用的助手,可以为您进行文本翻译。

我正在做一些作业,卡住了。我需要用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
你卡在哪里了? - bozdoz
1
把数字读入一个数字列表可能不是最好的方法。你能想到一种更像“表格”的方式来表示这些数字吗?然后,你可以遍历每一行,其中每一行有两列:数量和价格。 - hankd
发布一个账单文件的例子 - njzk2
在你的循环中,n未被定义且从未改变。 - njzk2
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

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)

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

2 10$
1 10$
3 20.00$

输出结果为:

90.0

此外,您可能希望避免使用file = open('data.txt', 'r')这种需要显式关闭文件的方式。而是使用with open('data.txt', 'r') as f:,这样文件将会隐式地被关闭。


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)

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接