Python 索引错误值不在列表中...在 .index(value) 上
Posted
技术标签:
【中文标题】Python 索引错误值不在列表中...在 .index(value) 上【英文标题】:Python index error value not in list...on .index(value) 【发布时间】:2012-08-19 06:54:36 【问题描述】:我是 Python 的初学者,对于那些对我的帖子持负面看法的人,请离开。我只是在这里寻求帮助并尝试学习。我试图在一个简单的数据集中检查 0 和 1。这将用于定义平面图上的空隙和实体,以定义建筑物中的区域……最终,0 和 1 将与坐标交换。
我收到此错误:ValueError: [0, 3] 不在列表中
我只是检查一个列表是否包含在另一个列表中。
currentPosition's value is [0, 3]
subset, [[0, 3], [0, 4], [0, 5], [1, 3], [1, 4], [1, 5], [2, 1], [3, 1], [3, 4], [3, 5], [3, 6], [3, 7]]
这里是sn-p的代码:
def addRelationship(locale, subset):
subset = []; subSetCount = 0
for rowCount in range(0, len(locale)):
for columnCount in range (0, int(len(locale[rowCount])-1)):
height = len(locale)
width = int(len(locale[rowCount]))
currentPosition = [rowCount, columnCount]
currentVal = locale[rowCount][columnCount]
print "Current position is:" , currentPosition, "=", currentVal
if (currentVal==0 and subset.index(currentPosition)):
subset.append([rowCount,columnCount])
posToCheck = [rowCount, columnCount]
print "*********************************************Val 0 detected, sending coordinate to check : ", posToCheck
newPosForward = checkForward(posToCheck)
newPosBackward = checkBackward(posToCheck)
newPosUp = checkUpRow(posToCheck)
newPosDown = checkDwnRow(posToCheck)
我正在使用 subset.index(currentPosition) 来检查 [0,3] 是否在子集中,但得到的 [0,3] 不在列表中。怎么会?
【问题讨论】:
请发布您的实际代码。 这个奇怪的代码应该做什么?请将您的问题带到最小且易于理解的测试集中。 *** 不是关于请破译我的代码。 您设置了subset=[]
,然后在调用.index
之前永远不会向其附加任何内容。第一个.index
调用not 怎么会引发ValueError? subset
在构造上总是空的。
@DSM:它应该提出一个ValueError
。
@user1518600:公平地说,Maulwurfn 的这段代码非常神秘。如果你解释你的算法,很可能有人会提出一个更好的方法来完成同样的事情。这尤其适用于你的情况,作为一个新的 python 编码器。
【参考方案1】:
subset.index(currentPosition)
在currentPosition
位于subset
的索引0 处时评估False
,因此您的if
条件在这种情况下失败。你想要的大概是:
...
if currentVal == 0 and currentPosition in subset:
...
【讨论】:
不错,但我认为这只是问题的一部分。【参考方案2】:让我们展示一些抛出相同错误的等效代码。
a = [[1,2],[3,4]]
b = [[2,3],[4,5]]
# Works correctly, returns 0
a.index([1,2])
# Throws error because list does not contain it
b.index([1,2])
如果您只需要知道某个内容是否包含在列表中,请像这样使用关键字in
。
if [1,2] in a:
pass
或者,如果您需要确切的位置但不知道列表是否包含它,您可以捕获错误,这样您的程序就不会崩溃。
index = None
try:
index = b.index([0,3])
except ValueError:
print("List does not contain value")
【讨论】:
如果需要抓取索引,应将其赋值给try
中的一个变量,并在except
中赋值None
。
如果在except
子句中进行None
赋值,则在存在索引的情况下会跳过一次赋值操作。是的,过早的优化通常是要避免的,但我认为在这种情况下,它也会使代码更加明确。
这是一个微不足道的问题,但为了清楚起见,我更喜欢在条件之外创建变量。这可能是我在 C 中编码时避免使用的一种风格,但它让我更舒服。【参考方案3】:
为什么要把事情复杂化
a = [[1,2],[3,4]]
val1 = [3,4]
val2 = [2,5]
检查一下
a.index(val1) if val1 in a else -1
a.index(val2) if val2 in a else -1
【讨论】:
这不能用作索引 -1 指的是列表的最后一个元素。【参考方案4】:我发现了
list = [1,2,3]
for item in range(len(list)):
print(item)
行不通,因为它从0开始,所以你需要写
for item in range(1, len(list)):
print(item)
【讨论】:
以上是关于Python 索引错误值不在列表中...在 .index(value) 上的主要内容,如果未能解决你的问题,请参考以下文章
颤振错误:RangeError(索引):无效值:不在0..2范围内,包括:3
如何在 python 3.4 tkinter“索引错误:列表索引超出范围”中修复此错误
Pandas Dataframe 中的索引行不在索引列表中(Python)[重复]