首页 > 解决方案 > 走十分钟(代码战)- Python

问题描述

我正在对 Codewars 进行 Python 练习。这些是说明:

“你住在笛卡尔市,所有的道路都布置在一个完美的网格中。你提前十分钟到了约会,所以你决定借此机会去走一小段路。这个城市为它的公民提供了一个在他们的手机上生成步行应用程序 - 每次您按下按钮时,它都会向您发送一组代表步行方向的单字母字符串(例如 ['n', 's', 'w', 'e'])。每个字母(方向)总是只走一个街区,你知道穿过一个街区需要一分钟,所以创建一个返回 true 的函数,如果应用程序给你的步行将花费你正好十分钟(你不'不想早或晚!)当然,会让你回到你的起点。否则返回false。

注意:您将始终收到一个有效的数组,其中包含随机排列的方向字母(仅限“n”、“s”、“e”或“w”)。它永远不会给你一个空数组(那不是走路,那是静止不动!)。”

这是我写的代码:

def is_valid_walk(walk):
    #determine if walk is valid
    location = 0
    if len(walk) == 10:
        for i in range(0, len(walk)):
            if walk[i+1] == walk[i] or walk[i-1] == walk[i]:
                return False
            else:
                if i == 'n':
                    location+=1
                elif i == 's':
                    location-=1
                elif i == 'w':
                    location+=2
                elif i == 'e':
                    location-=2
        return location == 0
    else:
        return False

我似乎有一个索引错误。它说它超出范围。

Traceback (most recent call last):
  File "main.py", line 4, in <module>
    test.expect(is_valid_walk(['n','s','n','s','n','s','n','s','n','s']), 'should return True');
  File "/home/codewarrior/solution.py", line 7, in is_valid_walk
    if walk[i+1] == walk[i] or walk[i-1] == walk[i]:
IndexError: list index out of range

有人可以指出我该如何解决这个问题吗?

标签: pythonarraysfor-loopindexingrange

解决方案


问题在代码的以下部分。

if len(walk) == 10:
        for i in range(0, len(walk)):
            if walk[i+1] == walk[i] or walk[i-1] == walk[i]: #IndexError here
                return False

当您尝试获取列表中不存在或超出该列表范围的索引时,会发生 IndexError。这里循环将从 0 运行到 9,这意味着您的代码将尝试在最后一次迭代中比较walk[9+1]ie 。walk[10]因为,索引 0 到 9 是为 list walk 定义的,所以当我们尝试索引 10 或i=10. 同样检查walk[i-1]when i=0

这可以通过添加适当的 if 条件来解决。


推荐阅读