【问题标题】:Function logic explanation功能逻辑说明
【发布时间】:2022-01-14 21:02:33
【问题描述】:

我遇到了这个关于代码大战的练习,这让我困惑了几天。练习是编写一个接收方向列表的函数。然后该函数应该将方向“减少”到更简单的方向。例如,如果您要前往 'NORTH','SOUTH','EAST','NORTH' ;由于向北行驶,然后再次向南行驶,方向将减少为“东”、“北”,这会将您置于同一位置。所有变体都需要进行相同的“减少”过程: N S , W E

我最终不得不找到已经过测试并作为问题解决方案的代码。我的问题是我并不完全理解其背后的逻辑。我已经继续并将下面的代码与一些 cmets 放在我的思考过程中,代码中发生了什么。我

我只是想更清楚地了解这个粒子代码。谢谢!

def dirReduc(arr):
    
    #create a dictionary with all the possible combinations that need to be 'reduced'
    opposites = {'NORTH':'SOUTH', 'SOUTH':'NORTH', 'EAST':'WEST', 'WEST':'EAST'} 
    
    #create an empty list to store the valid directions that are not reduced. 
    new_list = []
    
    #iterate through the list of items that has been passed to the function.
    for item in arr:
        #This is where i get lost. I dont understand the logic behind this. 
        #you check to see if the new list and the corrosponding item in the dictionary are equal to an empty list??
        if new_list and opposites[item] == new_list[-1]:
            new_list.pop()
        else:
            new_list.append(item)
    return new_list

【问题讨论】:

  • "if new_list" 检查new_list 不为空(意味着我们至少移动了一次)。如果是这样,那么new_list[-1](最后一个元素)就是我们所做的最后一步。所以opposites[item] == new_list[-1] 检查我们即将进行的移动是否与我们刚刚进行的移动相反,如果是,我们撤消上一个移动而不是添加一个新移动。
  • 您可能会被and 绊倒。实际上,该条件的运算顺序解析为 if (new_list) and (opposites[item] == new_list[-1]): - and 运算符的优先级低于 == 运算符。
  • 因此,由于列表为空,if 语句通过了第一次遍历,else 语句使用传递的参数中的第一项填充列表。然后在第二次迭代中,if 语句看到列表不再为空,然后使用比较运算符查看字典值是否等于新列表的最后一个索引?

标签: python function


【解决方案1】:

所以,你的问题是'你检查字典中的新列表和对应的项目是否等于一个空列表?'

if 语句由两部分组成,它们之间有一个“和”。

  • 如果新列表为空并且第一个 'if new_list' 返回 false 不会评估'and'之后的语句,而是会 转发到 else-part 以将项目添加到新列表中。
  • 如果新列表不为空且当前项目与 上一项 (opposites[item] == new_list[-1]) 上一项是 从新列表中删除。
  • 如果新列表不为空且当前项目不与 上一项,代码将转发到else-part添加该项 到新列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 2018-01-14
    • 2020-02-02
    • 1970-01-01
    • 2014-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多