pythonIf语句、For循环、文件读取

pythonIf语句、For循环、文件读取,python,python-3.x,for-loop,if-statement,control-structure,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磅和=30磅 如果没有重量的包裹 类,报告消息“N/A”

说清楚一点,我不是要求任何人为我做这件事。我只是问一个问题寻求指导,这样我就可以继续这方面的工作

我们得到了一个文件,其中给出了不同重量的包裹

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

再说一遍,我不是在找人帮我做这件事。我正在寻找下一步和/或调整,我目前必须能够继续前进。谢谢大家!

保持3个变量以计算3个范围,如
weight1Sum、weight2Sum、weight3Sum
并在第一次将其初始化为零,如weight1Sum=0

您的
计数
变量正常。当重量在范围内时,您需要为其添加值。然后,u可以将相关权重和从计数中除以,以显示相关值

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

首先,您需要三个
weight
count
变量:每个类别一个

那么你对文件的读取有点缺陷。不要从读一行开始,而是让循环开始,并在循环中指定你要做的第一件事
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...
total_small=0
总数=0
总数=0
count\u small=0
中位数=0
计数\u大=0
对于填充中的线:
重量=整数(直线)
如果重量<10:
总重量_小+=重量
计数\u小+=1
#中型和大型也一样。。。
然后在循环之后,您可以在打印时轻松计算每个类别的平均值


哦,您不需要检查中间包的上限,这是您需要做的。

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

换句话说,您不需要调用file对象上的
close()
方法,并且您可以确保在出现异常时关闭raise

所以

使用起来会更好

with open("packages.txt",'r') as infile:
    #following operation 
    #on infile like reading
平均计算 对于此操作,可以使用。这是一种地图数据结构,一组
键、值
对,其中需要是字符串(在本例中为“小”、“中”、“大”),而可以是简单类型或其他数据结构,如列表、字典或对象

读取文件时,您将使用基于if条件的权重填充列表,最后您可以使用自由列表并使用sum()和len()计算平均值


阅读此问题的答案,了解如何拥有一个无序的数据结构。

如何检查上限?是否必须在我的控制结构的ELIF部分执行此操作?@H.Raydon条件应为“如果重量大于等于10且重量小于30”。任何一本书或教程都应该告诉您如何在这种情况下进行操作。
infile = open("packages.txt", 'r')
#operations on file
...
infile.close()
with open("packages.txt",'r') as infile:
    #following operation 
    #on infile like reading
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)))
def averageValues(values,decimals=1):
    float = "%." +  str(decimals) + "f"
    try:
        avg = sum(values)/len(values)
        return float % avg
    except:
        return "N/A"