Python; If 语句、For 循环、文件读取
Python; If statements, For Loops, File Reading
需要说明的是,我并不是要任何人为我做这件事。我只是问一个问题寻求指导,这样我就可以继续做这件事。
我们得到了一个文件,其中给出了不同重量的包裹;
11
25
12
82
20
25
32
35
40
28
50
51
18
48
90
我必须创建一个程序来计算包裹的数量,将它们分为小、中和大,然后计算重量的平均值。
我知道我必须使用 If 语句和 for 循环来累积重量计数并将它们分类到每个类别中。
小号、中号、大号的术语如下;
小号 < 10 磅
中号 >= 10 磅。并且 < 30 磅
大号 >= 30 磅。
如果没有一个重量的包裹
class 被输入,报告消息“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
再说一次,我不是在找人帮我做这件事。我正在寻找下一步 and/or 对我目前必须能够继续前进的调整。谢谢!
维护 3 个变量来计算 3 个范围,例如
weight1Sum,weight2Sum,weight3Sum
并将其初始化为零,如 weight1Sum = 0
您的 count
变量没问题。当重量在范围内时,您需要增加重量值。然后你可以将相关的weightSum从count中除以显示相关值。
一般需要根据范围维护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...
然后在循环之后,您可以在打印时轻松计算每个类别的平均值。
哦,而且你没有检查中包的上限,你需要这样做。
首先我认为在处理文件对象时使用with
语句更好。这样做的好处是文件在其套件完成后会正确关闭,即使在途中引发异常也是如此。
换句话说,您不需要在文件对象上调用 close()
方法,并且您确定在异常情况下 raise 已关闭。
所以
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 需要是字符串(在你的例子中 "small","medium","large") 和 value 可以是简单类型或其他数据结构,如列表、字典或对象。
在阅读文件时,您将根据 if 条件用权重填充列表,最后您可以使用空闲列表并使用 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()
是以下函数,它计算平均值,return 它像字符串一样按我们想要的小数位数计算。
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 是一种无序数据结构。
需要说明的是,我并不是要任何人为我做这件事。我只是问一个问题寻求指导,这样我就可以继续做这件事。
我们得到了一个文件,其中给出了不同重量的包裹;
11
25
12
82
20
25
32
35
40
28
50
51
18
48
90
我必须创建一个程序来计算包裹的数量,将它们分为小、中和大,然后计算重量的平均值。 我知道我必须使用 If 语句和 for 循环来累积重量计数并将它们分类到每个类别中。
小号、中号、大号的术语如下;
小号 < 10 磅
中号 >= 10 磅。并且 < 30 磅
大号 >= 30 磅。
如果没有一个重量的包裹 class 被输入,报告消息“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
再说一次,我不是在找人帮我做这件事。我正在寻找下一步 and/or 对我目前必须能够继续前进的调整。谢谢!
维护 3 个变量来计算 3 个范围,例如
weight1Sum,weight2Sum,weight3Sum
并将其初始化为零,如 weight1Sum = 0
您的 count
变量没问题。当重量在范围内时,您需要增加重量值。然后你可以将相关的weightSum从count中除以显示相关值。
一般需要根据范围维护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...
然后在循环之后,您可以在打印时轻松计算每个类别的平均值。
哦,而且你没有检查中包的上限,你需要这样做。
首先我认为在处理文件对象时使用with
语句更好。这样做的好处是文件在其套件完成后会正确关闭,即使在途中引发异常也是如此。
换句话说,您不需要在文件对象上调用 close()
方法,并且您确定在异常情况下 raise 已关闭。
所以
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 需要是字符串(在你的例子中 "small","medium","large") 和 value 可以是简单类型或其他数据结构,如列表、字典或对象。
在阅读文件时,您将根据 if 条件用权重填充列表,最后您可以使用空闲列表并使用 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()
是以下函数,它计算平均值,return 它像字符串一样按我们想要的小数位数计算。
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 是一种无序数据结构。