所以我正在研究一些 python 代碼,這樣我就可以更好地理解字典。我只學習了 python 2 周,它是我的第一語言,所以我這邊肯定缺乏知識。我最初啟動該程式是為了讓用戶輸入他們在視頻系列中所在的節號,然后它會輸出他們在整個系列中還剩下多少時間。我想擴展代碼以添加更多輸出,例如 % complete 等。我最后添加到程式的輸出之一是將用戶輸入的部分作為輸入并顯示該部分的長度。共有 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 中查看哪些命令并學習如何完成此操作。謝謝您的意見。
uj5u.com熱心網友回復:
整個事情可以是這樣的:
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')
因為你只有 2 個案例。
情況一:當總時間為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
例如,section1有一個current_total_timeof 19,因此它不滿足 if 陳述句中的條件if current_total_time >= 60。因此,current_total_minutes和current_total_hours將保持不變0,因為它們只有在上述條件被評估為真時才會改變。
最后,在你的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,因此永遠不會列印任何內容。
祝您學習愉快。
uj5u.com熱心網友回復:
問題:init to 0 assignment inside 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,minutes和hours變數仍然是0。相反,在-block之外和之前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 " , or "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 分鐘”(
else f"{minutes} minute...),或 - “x 分鐘”(如果需要則
{'s' if minutes > 1 else ''}添加)s
示例更改
全部放在一起:
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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/534502.html
標籤:Python字典
