蟒蛇; If语句,For循环,文件读取

时间:2018-10-31 15:02:39

标签: python python-3.x for-loop if-statement control-structure

需要明确的是,我并不是要有人为我这样做。我只是问一个寻求指导的问题,以便我可以继续进行下去。

我们得到了一个文件,其中给出了各种包装重量;

11
25
12
82
20
25
32
35
40
28
50
51
18
48
90

我必须创建一个程序来计算包裹的数量,将它们分类为小,中和大,然后找到重量的平均值。 我知道我必须使用If语句和for循环来累积权重计数并将它们归类到每个类别中。

小,中,大的术语如下;

小巧<10磅

中等> = 10磅。和<30磅

大> = 30磅。

如果没有重量的包裹 输入班级后,报告消息“ N / A”而不是平均值(如果您尝试 除以0会得到一个例外)。

这是我到目前为止的代码,我无法弄清楚是否必须在if,elif和else之后包括for循环。或者,如果我所掌握的一切正常的话。

infile = open("packages.txt", 'r')
count = 0
line = infile.readline()
weight = int(line)
for line in infile:
    if weight < 10:
        count = count + 1
        weight = weight + int(line)
        while weight < 10:
            try:
                avg = weight / count
            except ValueError:
                print("N/A")
    elif weight >= 10:
        if weight < 30:
            weight = weight + int(line)
            count = count + 1
            avg = weight/count
    else:
        weight = weight + int(line)
        count = count + 1
        avg = weight/count

输出必须看起来像这样

Category    Count    Average
Small       0        N/A
Medium      7        19.9
Large       8        53.5

再次,我不是要找人为我这样做。我正在寻找下一步和/或调整我目前必须能够继续前进的内容。谢谢!

3 个答案:

答案 0 :(得分:1)

第一件事,我认为在处理文件对象时最好使用with语句。这样做的好处是,即使在执行过程中引发了异常,文件在其套件完成后也将正确关闭。

换句话说,您无需在文件对象上调用close()方法,并且可以确保在发生异常引发的情况下将其关闭。

所以

infile = open("packages.txt", 'r')
#operations on file
...
infile.close()

使用会更好

with open("packages.txt",'r') as infile:
    #following operation 
    #on infile like reading

平均计算

对于此操作,您可以使用dictionary。这是一个地图数据结构,一组key,value对,其中 key 需要为字符串(在您的情况下为“小”,“中”,“大” “)和 value 可以是简单类型,也可以是其他数据结构,例如列表,字典或对象。

在读取文件时,您将根据条件(如果有条件)使用权重填充列表,最后可以使用免费列表并使用sum()和len()计算平均值。

packages = {"small": [],
            "medium": [],
            "large": []}

with open("packages.txt","r") as packs:
    for pack in packs:
        weight = int(pack)
        if weight < 10:
            packages["small"].append(weight)
        elif weight < 30:
            packages["medium"].append(weight)
        else:
            packages["large"].append(weight)
###Printing the the average###
table_row = "%s\t%i\t%s" # string for formatting output, not the best solution
for key,weights in packages.items():
    print(table_row % (key, len(weights), averageValues(weights)))

其中averageValues()是以下函数,该函数计算平均值并按我们想要的小数位数将其像字符串一样返回。

def averageValues(values,decimals=1):
    float = "%." +  str(decimals) + "f"
    try:
        avg = sum(values)/len(values)
        return float % avg
    except:
        return "N/A"

阅读该问题的答案,以了解如何拥有ordered representation of the dictionary,即无序的数据结构。

答案 1 :(得分:0)

维护3个变量以计数3个范围,例如 weight1Sum,weight2Sum,weight3Sum并首先将其初始化为零,例如weight1Sum = 0

您的count变量正常。当重量在范围内时,您需要增加重量值。然后,您可以将相关的weightSum从计数中除以显示相关的值。

通常,您需要根据范围保持3个权重并进行更新。

答案 2 :(得分:0)

首先,您需要三个 weightcount变量:每个类别一个。

然后,您对该文件的阅读有些瑕疵。不要从阅读一行开始,而应该先进行循环,然后将循环中的第一件事分配给weight

也许是这样的:

total_small = 0
total_medium = 0
total_large = 0
count_small = 0
count_medium = 0
count_large = 0

for line in infile:
    weight = int(line)

    if weight < 10:
        total_small += weight
        count_small += 1
    # And the same for medium and large as well...

然后 循环之后,您可以轻松计算出每个类别的平均值。

哦,您不必检查中型软件包的上限,而需要这样做。