Python-如何在列表中搜索元组

Python-如何在列表中搜索元组,python,list,tuples,Python,List,Tuples,我已经搜索了几个小时,但我似乎找不到一个足够深入的答案;每个人都停在一张单子里的一张单子上。当我尝试外推我认为我需要的东西时,我得到一个错误,上面写着“TypeError:‘int’对象不可下标”。我是个无赖,所以如果你能解释一下我做错了什么,以及如何改正,我将非常感激 所以。。。我有5个项目,我想放在一个网格上,没有重叠。对于每个项目,我创建一个元组列表,表示项目将覆盖的坐标。对于每个列表,我想将所有坐标与我放置的所有其他项目的坐标进行比较。如果有任何坐标被复制,我抛出列表并生成一个新的。否则

我已经搜索了几个小时,但我似乎找不到一个足够深入的答案;每个人都停在一张单子里的一张单子上。当我尝试外推我认为我需要的东西时,我得到一个错误,上面写着“TypeError:‘int’对象不可下标”。我是个无赖,所以如果你能解释一下我做错了什么,以及如何改正,我将非常感激

所以。。。我有5个项目,我想放在一个网格上,没有重叠。对于每个项目,我创建一个元组列表,表示项目将覆盖的坐标。对于每个列表,我想将所有坐标与我放置的所有其他项目的坐标进行比较。如果有任何坐标被复制,我抛出列表并生成一个新的。否则,我会将新列表添加到“主”列表中。最后,我得到了一个元组列表,如下所示:

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)]
>>> any(c for c in checkC for i in usedCoords if c in i)
True
问题是,如何比较这两个元组并确保它们不匹配?这就是我所处的位置,但它似乎不起作用。(check()是创建元组列表的函数)


没有得到你想要达到的目标。 我想 这个

应该是这样

for i in range(len(checkC)) :
    if checkC[i] in usedCoords :
        tf = True
        print('used')

您的
checkC
是一个元组列表,而不是您声称的元组列表:因此,当您在checkC:中对i执行
时,每个
i
都只是一个元组,就像
(15,12)

因此,
i[1]
是完全有效的,它是
(15,12)
的第二个元素,即
12
。但是
i[1][1]
不是它是
(15,12)
第二个元素的第二个元素,它是
12
的第二个元素,它是没有意义的,因为
12
是一个int,没有元素。因此出现了错误

但我根本不知道你为什么要给
I
编制索引。您希望将元组
(15,12)
作为单个值进行查找;您不想分别查找15和12。所以只要使用
i
,而不是
i[任何东西]


这将消除您的实际错误,因为如果我在userCoords中使用
,则
是合法的,但仍然没有用。像
(15,12)
这样的元组不可能出现在
usedwords
中,因为
usedwords
只包含元组列表,而不包含元组

您要询问的是
i
是否在
usedwords
中的任何子列表中:

if any(i in sublist for sublist in usedCoords):
    print('Used')
如果您不理解
任何
函数和生成器表达式或其他理解,您应该阅读官方教程,从;它比任何一时冲动的回答都能更好地解释这个问题。但在此之前,您始终可以编写循环并显式检查:

for sublist in usedCoords:
    if i in sublist:
        print('Used')
        break
else:
    print('Not used')

同时,您的循环也有一个问题。对于
checkC
的每个成员,如果找到
tf
则将其设置为
True
,如果未找到则将其设置为
False
。因此,在循环结束时,
tf
只会告诉您是否找到了最后一个成员。如果您想知道是否找到了任何成员,则不能继续重置
tf=False
;一旦它是
真的
,它就必须永远保持
真的
。所以,整个事情变成:

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)

只需检查其他列表中是否存在您的合作伙伴,如下所示:

checkC =  [(15, 12), (15, 13), (15, 14), (15, 15), (15, 16), (15, 17)]
>>> any(c for c in checkC for i in usedCoords if c in i)
True

这里的True表示至少有一个匹配项。在示例数据中,UsedWord中的最后一个列表包含checkC中的元组。

如果他在checkC中为i执行
,并且
checkC
是元组列表,那么
i
不是int,而是元组。好的。这是有道理的。但它不是在UsedWord中查找元组,而只是查找列表吗?我如何让它查看这些列表?或者这是必要的?您的答案仍然是“
i
是一个int变量而不是列表”,这仍然是不正确的。更改代码,使
i
为int,并用索引上的循环替换Pythonic
for…in
循环,不会改善任何效果。@Gned它正在查看这些列表。请使用示例输入进行检查。@abarnet我刚刚编辑了代码,没有编辑这些行,对此表示抱歉。这取决于他的值没有一个是错误的。虽然这在这里有效,但这不是一个好主意;最好做
any(c在i中代表c在checkC中代表i在UsedWord中)
,如我的答案所示。这会告诉您是否存在匹配项,而不是任何匹配项是否真实。感谢您的深入解释。当您遇到这样的问题时,查看变量中的实际内容非常有帮助。在checkC:
中为i添加一个
print(i)
语句,或者在调试器中运行它并在那里放置一个断点,您将很快看到
i
值是什么,而不必猜测它们。