在python中查找列表中的子列表

时间:2011-10-02 16:19:05

标签: python

我有一个数字列表

l = [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 1, 0, 0, 0, 0]
[0, 0, 2, 1, 1, 2, 0, 0, 0, 0]
[0, 0, 2, 1, 1, 2, 2, 0, 0, 1]
[0, 0, 1, 2, 2, 0, 1, 0, 0, 2]
[1, 0, 1, 1, 1, 2, 1, 0, 2, 1]]

例如,我必须搜索模式“2,1,1,2”,因为我们可以看到第6行和第7行中存在。 为了找到该序列,我尝试将每个列表转换为str并尝试搜索模式,但由于某种原因,代码无法正常工作。

import re
for i in l:
 if re.search('2,1,1,2' , str(i).strip('[').strip(']')): print " pattern found"
我在这里错过了一些东西吗?

4 个答案:

答案 0 :(得分:5)

在字符串中转换列表确实不是一个好主意。

这样的事情怎么样:

def getsubidx(x, y):
    l1, l2 = len(x), len(y)
    for i in range(l1):
        if x[i:i+l2] == y:
            return i

答案 1 :(得分:2)

我建议您使用Knuth-Morris-Pratt algorithm。我想你是隐含地假设你的模式只出现在列表中一次,或者你只是想知道它是否存在。

如果您想要开始序列的每个第一个元素的列表,那么您可以使用KMP。把它想象成列表的string.find()。

我希望这会有所帮助。

答案 2 :(得分:1)

l = [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
[0, 0, 2, 1, 1, 2, 0, 0, 0, 0],
[0, 0, 2, 1, 1, 2, 2, 0, 0, 1],
[0, 0, 1, 2, 2, 0, 1, 0, 0, 2],
[1, 0, 1, 1, 1, 2, 1, 0, 2, 1]]
import re
for i in l:
    if re.search('2, 1, 1, 2' , str(i).strip('[').strip(']')): 
        print " pattern found"

str(list)将返回元素之间带有空格的字符串...您应该查找'2, 1, 1, 2'而不是2,1,1,2

答案 3 :(得分:0)

这是相同的想法,没有正则表达式

data = [
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
     [0, 0, 2, 1, 1, 2, 0, 0, 0, 0],
     [0, 0, 2, 1, 1, 2, 2, 0, 0, 1],
     [0, 0, 1, 2, 2, 0, 1, 0, 0, 2],
     [1, 0, 1, 1, 1, 2, 1, 0, 2, 1],
]

pattern = '2112'

for item in data:
    line = ''
    for number in item:
        line += str(number)
    if pattern in line:
        print 'pattern found: %s' % item