我一直在寻找几个小时,而我似乎无法找到足够深入的答案;每个人都停在例如列表中的列表中。当我试图推断我认为我需要的东西时,我得到一个错误,上面写着" TypeError:' int'对象不是可订阅的"。我非常喜欢菜鸟,所以如果你能解释我做错了什么,以及如何解决它,我会非常感激。
所以......我有5个项目要放在网格上,没有它们重叠。对于每个项目,我创建一个元组列表,表示项目将覆盖的坐标。对于每个列表,我想将所有坐标与我放置的所有其他项的坐标进行比较。如果任何坐标重复,我抛出列表并生成一个新的坐标。否则,我将新列表添加到" master"名单。所以,我最终得到了一个元组列表列表,如下所示:
usedCoords = [[(5, 18), (5, 19)], [(2, 4), (3, 4), (4, 4)], [(8, 17), (9, 17), (10, 17), (11, 17)], [(6, 3), (6, 4), (6, 5), (6, 6), (6, 7)], [(15, 12), (15, 13), (15, 14), (15, 15), (15, 16), (15, 17)]]
然后我生成另一个列表,如下所示:
checkC = [(15, 12), (15, 13), (15, 14), (15, 15), (15, 16), (15, 17)]
问题是,如何比较两者并确保没有元组匹配?这就是我所处的地方,但它似乎并没有起作用。 (check()是创建元组列表的函数)
check()
for i in checkC:
if i[1][1] in usedCoords:
tf = True
print('used')
else:
tf = False
if tf == False:
usedCoords.append(checkC)
tf = True
print('usedCoords = ',usedCoords)
print('checkC = ', checkC)
答案 0 :(得分:1)
您的checkC
是一个元组列表 - 不是元组列表的列表,正如您所声称的那样:当您执行for i in checkC:
时,每个i
只是一个元组,就像(15, 12)
。
因此,i[1]
完全有效 - 它是(15, 12)
的第二个元素,即12
。但是i[1][1]
不是 - 它是(15, 12)
的第二个元素的第二个元素,它是12
的第二个元素,它没有意义,因为12
是一个int并没有元素。因此错误。
但我不知道为什么你要试图索引i
。您希望将元组(15, 12)
作为单个值查找;你不想分别查看15和12。所以只需使用i
,而不是i[anything]
。
这将消除您的实际错误,因为if i in userCoords
合法 - 但它仍然无用。像(15, 12)
这样的元组不可能在usedCoords
中,因为usedCoords
只包含元组列表,而不是元组。
您想问的是i
中的usedCoords
是否位于if any(i in sublist for sublist in usedCoords):
print('Used')
中的任何子列表中:
any
如果您不理解for sublist in usedCoords:
if i in sublist:
print('Used')
break
else:
print('Not used')
函数和生成器表达式或其他理解,您应该阅读官方教程,从Iterators开始;它解释它比任何激动人心的StackOverflow答案都要好得多。但在此之前,您总是可以编写循环并明确检查:
checkC
同时,你的循环也存在问题。对于tf
的每个成员,如果找到,则将True
设置为False
,如果不是tf
则设置为tf = False
。因此,在循环结束时,True
只会告诉您是否找到了最后一个成员。如果您想知道是否找到任何成员,则无法继续重置True
;一旦它tf = False
for i in checkC:
if any(i in sublist for sublist in usedCoords):
tf = True
print('used')
break
if tf == False:
usedCoords.append(checkC)
tf = True
,就必须永远保持for i in checkC:
if any(i in sublist for sublist in usedCoords):
print('used')
break
else:
usedCoords.append(checkC)
tf = True
。所以,整个事情变成了:
if any(i in sublist for i in checkC for sublist in usedCoords):
print('used')
else:
usedCoords.append(checkC)
可以简化为:
{{1}}
而且,更进一步,到:
{{1}}
答案 1 :(得分:0)
只需检查另一个列表中是否存在任何coords,如下所示:
>>> any(c for c in checkC for i in usedCoords if c in i)
True
这里真的意味着至少有一场比赛。在您的示例数据中,usedCoords中的最后一个列表包含来自checkC的元组。
答案 2 :(得分:-1)
没有得到你想要实现的目标。 我认为 此
for i in checkC:
if i[1][1] in usedCoords:
tf = True
print('used')
应该成为这个
for i in range(len(checkC)) :
if checkC[i] in usedCoords :
tf = True
print('used')