Python 如何改进评估列表以确定其是否包含特定连续项的方法?

Python 如何改进评估列表以确定其是否包含特定连续项的方法?,python,list,set,contains,intersection,Python,List,Set,Contains,Intersection,我有一个数千万个列表的嵌套列表(我也可以使用元组)。每个列表有2-7个项目。列表中的每个项目都是一个由1-5个字符组成的字符串,每个列表最多出现一次。(为了简单起见,我在下面的示例中使用单字符项) 我需要找到嵌套列表中的哪些列表包含一对项,这样我就可以在忽略其余项的同时对这些列表执行操作。这需要尽可能有效 我正在使用下面的函数,但它看起来相当慢,我只知道必须有一个更聪明的方法来做到这一点 def isBadInList(bad, checkThisList): numChecks = l

我有一个数千万个列表的嵌套列表(我也可以使用元组)。每个列表有2-7个项目。列表中的每个项目都是一个由1-5个字符组成的字符串,每个列表最多出现一次。(为了简单起见,我在下面的示例中使用单字符项)

我需要找到嵌套列表中的哪些列表包含一对项,这样我就可以在忽略其余项的同时对这些列表执行操作。这需要尽可能有效

我正在使用下面的函数,但它看起来相当慢,我只知道必须有一个更聪明的方法来做到这一点

def isBadInList(bad, checkThisList):
    numChecks = len(list) - 1
    for x in range(numChecks):
        if checkThisList[x] == bad[0] and checkThisList[x + 1] == bad[1]:
            return True
        elif checkThisList[x] == bad[1] and checkThisList[x + 1] == bad[0]:
            return True
    return False
我会这样做的

bad = ['O', 'I']

for checkThisList in nestedLists:
    result = isBadInList(bad, checkThisList)
    if result:
        doStuffToList(checkThisList)

#The function isBadInList() only returns true for the first and third list in nestedList and false for all else.
如果可能的话,我需要一种更快的方法。我可以使用元组而不是列表,或者其他任何东西

nestedList = [
    ['a', 'e', 'O', 'I', 'g', 's'],
    ['w', 'I', 'u', 'O', 's', 'g'],
    ['e', 'z', 's', 'I', 'O', 'g']
]

#first create a map
pairdict = dict()


for i in range(len(nestedList)):
    for j in range(len(nestedList[i])-1):
        pair1 = (nestedList[i][j],nestedList[i][j+1])
        if pair1 in pairdict:
            pairdict[pair1].append(i+1)
        else:
            pairdict[pair1] = [i+1]
        pair2 = (nestedList[i][j+1],nestedList[i][j])
        if pair2 in pairdict:
            pairdict[pair2].append(i+1)
        else:
            pairdict[pair2] = [i+1]

del nestedList

print(pairdict.get(('e','z'),None))
创建一个值对并将它们存储到map中,键是pair,值是index,然后删除列表(这可能会占用太多内存), 然后,您可以利用dict进行查找,并在值出现的地方打印索引

创建一个值对并将它们存储到map中,键是pair,值是index,然后删除列表(这可能会占用太多内存),
然后,您可以利用dict进行查找,并在值出现的位置打印索引。

我认为您可以在这里使用一些
regex
来加速此操作,尽管它仍然是一个顺序操作,因此您最好使用此方法,因为您必须迭代每个列表,然而,由于我们也必须迭代每个子列表,这将使它
O(n^2)


我认为您可以在这里使用一些
regex
来加速这个过程,尽管它仍然是一个顺序操作,所以您最好使用这种方法
O(n)
,因为您必须迭代每个列表,但是因为我们也必须迭代每个子列表,这将使它
O(n^2)


(1) 我假设字符串项不都是一个字符长?(2) 您是否计划经常为相同值的
嵌套列表
和不同值的
坏列表
运行此操作,或者反之亦然,或者每次运行时所有内容都不同?(3)大致有多少个不同的字符串项?请参阅。每个字符串项的长度为1-5个字符。另外,对于未来,我正在考虑将字符串项切换为int,这将表示唯一的字符串项。我有点欺骗来解决我的问题。我找到了一种将项目对表示为整数的方法。现在我可以简单地使用:intX是否在listY中。(1)我假设字符串项不都是一个字符长的?(2) 您是否计划经常为相同值的
嵌套列表
和不同值的
坏列表
运行此操作,或者反之亦然,或者每次运行时所有内容都不同?(3)大致有多少个不同的字符串项?请参阅。每个字符串项的长度为1-5个字符。另外,对于未来,我正在考虑将字符串项切换为int,这将表示唯一的字符串项。我有点欺骗来解决我的问题。我找到了一种将项目对表示为整数的方法。现在我可以简单地使用:is intX in listY。
nestedList = [
    ['a', 'e', 'O', 'I', 'g', 's'],
    ['w', 'I', 'u', 'O', 's', 'g'],
    ['e', 'z', 's', 'I', 'O', 'g']
]

#first create a map
pairdict = dict()


for i in range(len(nestedList)):
    for j in range(len(nestedList[i])-1):
        pair1 = (nestedList[i][j],nestedList[i][j+1])
        if pair1 in pairdict:
            pairdict[pair1].append(i+1)
        else:
            pairdict[pair1] = [i+1]
        pair2 = (nestedList[i][j+1],nestedList[i][j])
        if pair2 in pairdict:
            pairdict[pair2].append(i+1)
        else:
            pairdict[pair2] = [i+1]

del nestedList

print(pairdict.get(('e','z'),None))
import re

p = re.compile('[OI]{2}|[IO]{2}') # match only OI or IO

def is_bad(pattern, to_check): 
    for item in to_check:
        maybe_found = pattern.search(''.join(item))
        if maybe_found:
            yield True
        else:
            yield False


l = list(is_bad(p, nestedList))

print(l)
# [True, False, True]