【问题标题】:Renaming list indices in Python - seeking explanation of code在 Python 中重命名列表索引 - 寻求代码解释
【发布时间】:2017-11-30 15:05:22
【问题描述】:

我正在学习 Python,这是我第一次真正的编程体验。我一直在学习here的一系列课程。

我正在学习的课程是关于嵌套循环。然而,在一个练习中,他们通过实质上重命名列表项的索引来提供问题的解决方案。请记住,这不是正在使用的字典。虽然这些课程进展顺利,但这个问题的答案让我感到困惑,因为没有解释发生了什么。此外,我似乎在课程系列的其他任何地方或其他地方都找不到对这种技术的参考。

这是练习要求我做的事情。 1“编写一个程序,它使用嵌套的for循环来填充一个表示日历的三维列表:顶级列表应该包含每个月的子列表,每个月应该包含四个星期。每个星期应该是一个空列表。 2 修改您的代码,以便更容易地通过人类可读的月份名称访问日历中的月份,以及每周通过从 1 开始编号的名称。将事件(以字符串描述的形式)添加到七月的第二周。

第一部分没问题。考虑到参数,第二部分有点挑战性,但给出的答案不是我所期望的。

我已经看到了关于使用字典来完成这种命名索引目标的堆栈溢出的解释: Python: can I have a list with named indices?

但是,这里提供了解决方案:

(JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER) = range(12)

(WEEK_1, WEEK_2, WEEK_3, WEEK_4) = range(4)

calendar = []
for m in range(12):
    month = []

    for w in range(4):
        month.append([])

    calendar.append(month)
calendar[JULY][WEEK_2].append("Go on holiday!")
print(calendar)

有人可以解释一下这是如何工作的吗?我觉得奇怪的是月份和星期的名称不必是字符串,而只是变量名称。我认为每个变量名都被分配给定义的特定范围内的每个项目。但是,我很惊讶变量名可以用作列表索引。完成此操作后,我将无法再通过数值引用索引。例如,我不能使用:

calendar[1][1].append("This is the first week of January.")

我对此感到更加困惑,因为当我在最后一行之后编写一个简单的循环时:

for i in range(12):
    print(i)

我像往常一样打印出数字 0 到 11,但不是这些变量名。

究竟发生了什么,它是如何工作的?

【问题讨论】:

    标签: python-3.x list range indices


    【解决方案1】:

    像这样声明一个变量列表:

    (WEEK_1, WEEK_2, WEEK_3, WEEK_4) = range(4)

    是一种将多个值存储到多个变量的方法。和这样做是一样的:

    (WEEK_1, WEEK_2, WEEK_3, WEEK_4) = (0,1,2,3)
    

    或者这个:

    WEEK_1 = 0
    WEEK_2 = 1
    WEEK_3 = 2
    WEEK_4 = 3
    

    range(4) 返回从 0 到 3 的整数列表。

    range(4) == (0,1,2,3)
    

    在python中,可以写一个变量列表作为左操作数,并通过在右操作数上写一个数据列表来为它们赋值。在这种情况下,左侧列表的第一个变量将存储右侧第一条数据的值,左侧第二个变量将存储右侧第二条数据的值,依此类推。

    在您的练习中,月份和周仅以整数形式存储在内存中。 这些整数都存储在变量中,这些变量的名称代表了每个值所描述的内容。

    与您所说的相反,calendar[1][1].append("First week of January") 确实有效。从技术上讲,1 月的第一周在calendar[0][0],因为列表的索引从 0 开始。这是因为正如我们之前所说,WEEK_1, WEEK_2 等是存储整数的变量名。因此,同样的事情也会发生在几个月中。当您说calendar[JULY][WEEK_2] 时,它与说calendar[7][1] 完全相同,只是现在您已将这些数字存储到更易读的变量中,因此代码更能代表它的功能并且更易于阅读。

    【讨论】:

    • 我看到在 1 月的第一周的示例中,我将该索引降低了一个。我回去再次尝试calendar[0][0].append("First week of January")。在我收到 IndexError 说“索引超出范围”之前。然而,这一次我没有——所以这让我相信我在最初的尝试中出现了另一个错误。你的解释对我来说很有意义。现在有没有办法打印用于索引的这些变量的列表?我只是想更全面地了解整个想法,因为我在其他任何地方都没有看到用于索引的变量。谢谢!
    • 我想困惑的地方在于,虽然我理解JANUARY = 0, FEBRUARY = 1 等的赋值。我不明白为什么后来说for m in range(12):,我引用的是这些变量,而不是正常的整数.我明白为什么 JANUARY = 0,但如果 0 = JANUARY,为什么稍后我们说for w in range(4) 时不会发生冲突?我很难掌握这些信息的存储位置。如果我在这段代码的末尾添加print(list(range(12))),我仍然会得到整数。为什么 this 在一个实例中引用一组变量,而不是另一个?
    【解决方案2】:

    好的,我现在明白了。我的困惑是,在我看来,我正在分配名为变量​​的索引。我现在明白我只是给数字命名,而不是索引。不定数总是整数。

    我现在看到这一点是因为我可以使用以下任何一种方法来引用上述代码在 1 月的第二周:

    calendar[0][1].append("Week 2 of January")
    calendar[JANUARY][WEEK_2].append("Week 2 of January")
    calendar[JANUARY][FEBRUARY].append("Week 2 of January")
    calendar[WEEK_1][WEEK_2].append("Week 2 of January")
    

    所有这些都指向索引 [1] 和 [0]。我并没有以某种方式神奇地影响我正在调用的 range(12) 函数。

    【讨论】:

      【解决方案3】:

      (1 月、2 月、3 月、4 月、5 月、6 月、7 月、8 月、9 月、10 月、11 月、12 月)= range(12)

      (WEEK_1, WEEK_2, WEEK_3, WEEK_4) = 范围(4)

      calendar = []
      for m in range(12):
      month = []
      
      for w in range(4):
          month.append([])
      
      calendar.append(month)
      calendar[JULY][WEEK_2].append("Go on holiday!")
      print(calendar)
      

      这个程序没有运行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-17
        • 1970-01-01
        • 2014-12-02
        相关资源
        最近更新 更多