为什么我的Python代码在引用字典键高于14时不工作?



所以我正在编写一些python代码,这样我就可以更好地理解字典。我只学了两周的python,这是我的第一门语言,所以我肯定缺乏知识。我最初开始这个程序是为了让用户输入他们在一个视频系列中所处的片段号,它会输出他们在整个系列中还剩下多少时间。我认为扩展了代码,增加了更多的输出,如%完成等。我最后添加到程序中的一个输出是将用户输入的部分作为输入并显示该部分的长度。总共有23个部分,如果用户输入1-14,那么它就会准确地显示信息。但是,如果输入15-23,则在输出中完全忽略该显示行。我不会把所有的代码都贴出来,因为它太长了,但这里有一些相关的信息。

这是代码顶部的字典。键是该部分,值是该部分的分钟数。然后,程序中只有一个输入,后面是显示所选部分长度的代码。

video_dict = {
1 : 19, 2 : 54, 3 : 122, 4 : 9, 5 : 75, 6 : 174, 7 : 100, 8 : 81, 9 : 29, 10 : 46, 11 : 138, 12 : 23, 13 : 17, 14 : 143, 15 : 143,
16 : 24, 17 : 45, 18 : 28, 19 : 3, 20 : 41, 21 : 45, 22 : 15, 23 : 1
}

current_section = int(input('What section are you currently on? (1-23)n'))
# Show how long the selected section is
current_total_time = int(video_dict[current_section])
current_total_minutes = 0
current_total_hours = 0
if current_total_time >= 60:
current_total_minutes = int(current_total_time % 60)
current_total_hours = int((current_total_time - current_total_minutes) / 60)
if current_total_hours == 1:
if current_total_minutes == 1:
print(f'Section {current_section} is {current_total_hours} hour and {current_total_minutes} minute long.n')
elif current_total_minutes >= 2:
print(f'Section {current_section} is {current_total_hours} hour and {current_total_minutes} minutes long.n')
elif current_total_minutes == 0:
print(f'Section {current_section} is {current_total_hours} hour long.n')
elif current_total_hours >= 2:
if current_total_minutes == 1:
print(f'Section {current_section} is {current_total_hours} hours and {current_total_minutes} minute long.n')
elif current_total_minutes >= 2:
print(f'Section {current_section} is {current_total_hours} hours and {current_total_minutes} minutes long.n')
elif current_total_minutes == 0:
print(f'Section {current_section} is {current_total_hours} hours long.n')
elif (current_total_time > 0) and (current_total_time < 60):
if current_total_minutes == 1:
print(f'Section {current_section} is {current_total_minutes} minute long.n')
elif current_total_minutes >= 2:
print(f'Section {current_section} is {current_total_minutes} minutes long.n')

作为旁注,我知道这段代码可能有点太啰嗦了,但在我目前的学习阶段,这就是我所处的位置。有没有一种更短的方式来输入这段代码,这样我就可以把它整理一下了?你不需要输入一个例子,除非你想,你可以告诉我应该在python中查看哪些命令,并学习如何完成它。谢谢你的建议。

可以是这样:

video_dict = {
1 : 19, 2 : 54, 3 : 122, 4 : 9, 5 : 75, 6 : 174, 7 : 100, 8 : 81, 9 : 29, 10 : 46, 11 : 138, 12 : 23, 13 : 17, 14 : 143, 15 : 143,
16 : 24, 17 : 45, 18 : 28, 19 : 3, 20 : 41, 21 : 45, 22 : 15, 23 : 1
}
current_section = int(input('What section are you currently on? (1-23)n'))
# Show how long the selected section is
current_total_time = int(video_dict[current_section])
current_total_minutes = 0
current_total_hours = 0
current_total_minutes = int(current_total_time % 60)
current_total_hours = int((current_total_time - current_total_minutes) / 60)
if current_total_time >= 60:
print(f'Section {current_section} is {current_total_hours} hour and {current_total_minutes} minute long.n')
else:
print(f'Section {current_section} is {current_total_minutes} minute long.n')

因为你只有两种情况。

情况1:总时间大于等于60分钟。

情况2:总时间小于60分钟。

关于为什么你的代码不工作

将以下行移出if块。

current_total_minutes = int(current_total_time % 60)
current_total_hours = int((current_total_time - current_total_minutes) / 60)

所以它看起来像这样

current_total_minutes = int(current_total_time % 60)
current_total_hours = int((current_total_time - current_total_minutes) / 60)
if current_total_time >= 60:
if current_total_hours == 1:
if current_total_minutes == 1:
# Rest of your code here

例如,section1current_total_time19,因此它不满足if语句if current_total_time >= 60中的条件。因此,current_total_minutescurrent_total_hours将保持0,因为只有当上述条件求值为True时,它们才会改变。

最后,在elif块中:

elif (current_total_time > 0) and (current_total_time < 60):
if current_total_minutes == 1:
print(f'Section {current_section} is {current_total_minutes} minute long.n')
elif current_total_minutes >= 2:
print(f'Section {current_section} is {current_total_minutes} minutes long.n')

条件if current_total_minutes == 1永远不会求值为True,因此永远不会输出任何内容。

祝你学习愉快。

问题:init to0+在if-block内赋值

错误代码是:

current_total_minutes = 0
current_total_hours = 0
if current_total_time >= 60:
current_total_minutes = int(current_total_time % 60)
current_total_hours = int((current_total_time - current_total_minutes) / 60)

变量初始化为零,只有当总时间为>= 60时才更改;当程序下降到elif时,minuteshours变量仍然是0。相反,应该初始化if块外部和之前的变量,因为无论如何值都将保持不变,如下所示:

current_total_minutes = current_total_time % 60
current_total_hours   = current_total_time // 60
if ... # etc

其他建议:

divmod代替int(a % b)int(a / b)

当你越来越多地使用一门语言时,你会对内置函数&可用的模块,而无需重新部署自己的解决方案。你试图用一个数字(总数)除以60,得到整数(小时)和余数(分钟)。这里有一个函数!您可以使用divmod函数;它的文档字符串显示

divmod(x, y, /)
Return the tuple (x//y, x%y).  Invariant: div*y + mod == x.

装配f-string

我建议使用条件表达式来构建最终字符串,而不是嵌套的if-else块,特别是需要重复"hour(s)""minute(s)"的逻辑。通过这种方式,程序决定是否打印"""1 minute""x minutes"(以及类似的"""1 hour and ""x hours and "),然后将这些片段组合在一起。

例如,不用

if minutes == 0:
# leave minutes part blank
elif minutes == 1:
# print "1 minute"
elif minutes > 1:
# print "# minutes"

也可以写成

"" if not minutes else f"{minutes} minute{'s' if minutes > 1 else ''}"

将上面的内容分解——它是一个嵌套的条件语句。它给出

  • 空字符串("" if not minutes)
  • "1 minute"(else f"{minutes} minute...)
  • "x minutes"({'s' if minutes > 1 else ''}添加s如果需要)

示例修改

All put together:

times = [ 19, 54,122,  9, 75,174,
100, 81, 29, 43,138, 23,
17,143,143, 24, 45, 28,
3, 41, 45, 15,  1,    ]
# dict comprehension expression
video_dict = {idx: val for idx, val in enumerate(times, 1)}
section = int(input('What section are you currently on? (1-23)n'))
# Show how long the selected section is
total = video_dict[section]
hours, minutes = divmod(total, 60) # tuple expansion
hours_str = "" if not hours else f"{hours} hour{'s' if hours > 1 else ''} and "
minutes_str = "" if not minutes else f"{minutes} minute{'s' if minutes > 1 else ''}"
section_str = f"Section {section} is {hours_str}{minutes_str} long.n"
print(section_str)

相关内容

  • 没有找到相关文章

最新更新