If 语句检查一个数组是否不在另一个数组中

问题描述 投票:0回答:1

我目前正在做一个编码问题link的出现,我的解决方案涉及检查一个数组是否包含另一个数组。但是,if 语句不起作用,或者其他东西弄乱了我的代码。

string = " *really long thing, i deleted it* "
# example string = "v>"
location = [0,0]
been_to = [[0,0]]
string = list(string)

for i in string:
    if i == "v":
        #down
        location[1] -= 1
    elif i == "^":
        #up
        location[1] += 1
    elif i == ">":
        #right
        location[0] -= 1
    elif i == "<":
        #left
        location[0] += 1
    if location in been_to == False:
        been_to.append(location)
    #print(location)
print(been_to)

我尝试过交换变量,移动 not 或 == false,并且通常尝试任何想到的东西。我还是没有头绪。

python arrays if-statement
1个回答
0
投票

我认为,问题出在

if location in been_to == False:
行。 这没有达到您期望的效果。

在 Python 中,

in
是一个运算符,用于检查序列(如列表或字符串)中是否存在值。 但是,当您将
in
list of lists
一起使用时,它会检查外部列表中是否存在确切的列表, 如果存在具有相同元素的列表,则不会。
in
运算符通常使用 contains() 特殊方法来实现。

因此,在您的情况下,

location
是一个列表
[x, y]
been_to
是列表的列表
[[x1, y1], [x2, y2], ...]
。 当您执行
location in been_to
时,它会检查
[x, y]
中是否存在确切的列表
been_to
, 如果存在具有相同元素的列表,则不会。

这是因为列表不可散列,这意味着它们不能用作字典中的键或集合中的元素。另一方面,元组是可散列的,这意味着它们可以用作字典中的键或集合中的元素。这就是为什么使用元组而不是列表来解决问题。

您可以使用元组而不是列表来

location

,因为元组是

可哈希
并且可以比较是否相等。 location

string = "v>"
# string = "^v^v>><<<>>"

location = (0, 0)
been_to = [(0, 0)]
string = list(string)

for i in string:
    if i == "v":
        # down
        location = (location[0], location[1] - 1)
    elif i == "^":
        # up
        location = (location[0], location[1] + 1)
    elif i == ">":
        # right
        location = (location[0] + 1, location[1])
    elif i == "<":
        # left
        location = (location[0] - 1, location[1])
    
    # Check if the location is already in been_to
    if location not in been_to:
        been_to.append(location)

print(been_to)
print(f"Total houses visited at least once: {len(been_to)}")
此输出表示至少访问过一次的房屋列表,每个房屋由其坐标 (x, y) 表示。还打印了至少访问过一次的房屋总数。

© www.soinside.com 2019 - 2024. All rights reserved.