Python - 如何在列表内搜索列表内的元组

2024-04-19 03:42:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经找了几个小时了,似乎找不到一个足够深入的答案;每个人都会停下来,例如,列表中的一个列表。当我试图推断我需要什么时,我得到一个错误,它说“TypeError:'int'object is not subscribable”。我是个无名小卒,所以如果你能解释一下我做错了什么,以及如何解决它,我将非常感激。在

所以。。。我有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)]]

然后我生成另一个列表,如下所示:

^{pr2}$

问题是,如何比较这两个元组并确保没有一个元组匹配?这就是我所处的位置,但似乎不起作用。(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)

Tags: 项目答案infalsetrue列表iftf
3条回答

只需检查另一个列表中是否存在任何坐标,如下所示:

>>> any(c for c in checkC for i in usedCoords if c in i)
True

这里的“真”意味着至少有一个匹配。在示例数据中,usedcords中的最后一个列表包含checkC中的元组。在

您的checkC是一个元组列表,而不是一个元组列表,正如您所宣称的那样:因此,当您for i in checkC:时,每个{}只是一个元组,就像(15, 12)。在

所以,i[1]是完全有效的,它是(15, 12)的第二个元素,12。但是i[1][1]不是{}的第二个元素,它是{}的第二个元素,这是没有意义的,因为{}是一个整数,没有元素。因此出现了错误。在

但我根本不知道你为什么要索引i。您希望将元组(15, 12)作为单个值查找;您不希望分别查找15和12。所以只要使用i,而不是{}。在


这将消除您的实际错误,因为if i in userCoords是合法的,但它仍然没有用。像(15, 12)这样的元组不可能在usedCoords中,因为usedCoords只保存元组列表,而不是元组。在

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

if any(i in sublist for sublist in usedCoords):
    print('Used')

如果您不了解any函数和生成器表达式或其他理解,您应该通读官方教程,从Iterators开始;它解释得比StackOverflow的任何即时回答都好得多。但在此之前,您始终可以编写循环并显式检查:

^{pr2}$

同时,你的循环也有问题。对于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)

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

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

应该变成这样

^{pr2}$

相关问题 更多 >