【问题标题】:Searching for an element in a list with a loop in Python在 Python 中使用循环搜索列表中的元素
【发布时间】:2017-09-12 20:37:32
【问题描述】:

我在查找某个元素是否已经存储在 Python 代码的列表中时遇到了一些麻烦。我用过两个脚本。我写的第二个结果有效,但第一个没有,我不明白为什么(这让我很困扰)。我的列表名为grains,如下所示:
[[a, b], [c, d], [e, f], ...]

这是第一段代码,不起作用:

for i in range(0, len(grains) - 1) :
    if grains[i] == [x,y] :
        return
    else :
        grains.append([x,y])
        grains_restants = grains_restants - 1
        fourmi_chargee = False
        return

这是第二段代码,这个有效:

if not([x,y] in grains) :
    grains.append([x,y])
    grains_restants = grains_restants - 1
    fourmi_chargee = False
    return

所以我试图理解为什么第一段代码不起作用,但我放弃了。你知道为什么吗?

【问题讨论】:

  • grains 中的ab 的值是多少? xy 的值是多少?
  • range 的参数是inclusive, exclusive - 这意味着它将包括您给它的第一个数字,一直到但不包括第二个数字。因此,您永远不会真正访问 for 循环中的最后一个元素。
  • 因为在你的第一段代码中它只会比较grains[0] == [x, y],然后for循环将return要么是True要么是False
  • 另外,如果您的列表示例正确,则列表中不应有元素 [x,y]。相反,应该有[w, x]['y, z]
  • 您可能想要set 而不是list

标签: python list loops search


【解决方案1】:

您的第一段代码不会像您期望的那样循环列表grains,它实际上只会比较grains[0] == [x, y],并且for 循环将退出,因为returnif 和@ 中都有@ 987654326@ 分支,而第二个实现将检查[x, y] 是否在整个列表grains 中。

您应该使用这样的代码,但 for 循环代码应该是:

for i in grains:
    if i == [x,y] :
        break
else:
    grains.append([x,y])
    grains_restants = grains_restants - 1
    fourmi_chargee = False

【讨论】:

    【解决方案2】:
    for i in range(0, len(grains) - 1) :
        if grains[i] == [x,y] :
            return
        else :
            grains.append([x,y])
            grains_restants = grains_restants - 1
            fourmi_chargee = False
            return
    

    您正在将列表中的每个元素与[x,y] 匹配,但您确实想检查[x,y] 是否已经存在。这就是第二个代码 sn-p 使用 in 运算符所做的事情。

    现在为什么第一个不起作用?您没有提到您遇到了哪些错误/意外情况,但我可以看到一个。假设[x,y] 元素位于索引 3(第 4 项)中。但是您将其与 0,1,2 进行比较 => 所有这些都不会匹配并添加重复项然后返回。这真的不是你想要的。

    要检查元素是否存在,最好使用in 运算符。您还可以使用list.count 查看列表中是否存在任何元素(以及它在该列表中出现的次数)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-04
      • 2021-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-09
      • 2021-10-08
      相关资源
      最近更新 更多