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

时间:2015-04-13 06:37:58

标签: python list tuples

我一直在寻找几个小时,而我似乎无法找到足够深入的答案;每个人都停在例如列表中的列表中。当我试图推断我认为我需要的东西时,我得到一个错误,上面写着" 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)

3 个答案:

答案 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')