2

我正在尝试制定一个函数来查找列表中的特定模式。例如,如果我们取列表

x = [1,1,2,3,54,3,1]

然后我想检查模式 y 是否出现在列表 x 中:

y = [1,1,n,n,n,n,1]

其中 n 代表任意数字。所以在我的例子中它会返回True

我已经研究了 any() 函数,但我无法解决很多问题。

4

6 回答 6

3
>>> from operator import itemgetter
>>> x = [1, 1, 2, 3, 54, 3, 1]
>>> itemgetter(0,1,6)(x) == (1, 1, 1)
True

How is y really defined. Obviously you can't have n in there as a placeholder? Could your use None perhaps?

于 2013-03-28T04:15:32.990 回答
1
from itertools import izip, islice
x = [2,1,3,1,1,2,3,54,3,1,5,6,7,1,1,0,0,0,0,1]
y = [1,1,None,None,None,None,1]

print [i for i in xrange(len(x)-len(y)+1) 
         if all(b is None or a==b for a,b in izip(islice(x, i, i+len(y)), y))]

Or more code for easy to understand:

def nwise(x, n):
    for i in xrange(len(x)-n+1):
        yield i, islice(x, i, i+n)

def match(x, y):
    return all(b is None or a==b for a,b in izip(x, y))

print [i for i, xs in nwise(x, len(y)) if match(xs, y)]
于 2013-03-28T04:16:39.173 回答
1

我想你对什么any意思感到困惑。它用于检查一系列值,并查看它们中的任何一个是否为“真”。这与找出一个值是“任何数字”还是“任何这些可能性”无关。

如果您set想考虑一个固定的、有限的可能性,那么您真正想知道的是您的候选值是否是in该集合:

x in {1, 2, 3, 4, "hi mom"} # returns whether x is any of those values

但是“任意数”不是有限集。首先,您需要定义数字的含义;然后您需要执行适当的测试。听起来您要做的是检查该值是否为整数。换句话说,您关心列表中值的类型

如果您已经知道它们都是整数,那么就没有什么可测试的了;如果您不在乎价值是多少,那么在进行检查时就不要考虑它。但是如果你需要确定它是一个整数,那么做到这一点的方法是

isinstance(x, int) # returns whether x is an `int`

但是,当您实际上想在更长的列表中的任何位置查找模式时,您可能通过给出一个恰好与您的“模式”长度相同的示例“搜索列表”让感到困惑。

在这种情况下,您可以创建一个函数,将模式与相同长度的列表进行完全匹配;然后用于any检查是否有任何模式长度的子列表匹配。any旨在与生成器表达式一起使用,它看起来像这样:

def match(a_sublist, the_pattern):
    # put your logic here

def search(the_full_list, the_pattern):
    pattern_length, full_length = len(the_pattern), len(the_full_list)
    return any(
        match(the_full_list[i:i+pattern_length], the_pattern)
        for i in range(full_length - pattern_length)
    )

根据模式的细节,有更有效的匹配方法,这将受到字符串搜索算法和正则表达式引擎的启发。但这涉及到更加困难的材料-以上内容应该可以帮助您入门。

于 2013-03-28T04:21:16.520 回答
0

我想你想搜索一个模式匹配的列表......

x = [[1,1,2,3,54,3,1],[1,2,3,4,5,6,7],[2,4,6,8,10,12,14]]
y = [1,1,None,None,None,None,1] ## or [1,1,'n','n','n','n',1]

for l in x:
    if all(map(lambda x:x[0]==x[1],[x for x in zip(l,y) if x[1] and x[1]!='n'])):
        print l

输出:

[1,1,2,3,54,3,1]
于 2013-03-28T04:32:06.640 回答
0
x = [1,1,2,3,54,3,1]
y = [1,1,0,0,0,0,1]
any([i[0]==i[1] for i in zip(x,y)])
于 2013-03-28T05:16:08.417 回答
0

这种类型的问题非常适合Numpy 掩码数组

import numpy.ma as ma

x = ma.array([1,1,2,3,54,3,1])
y = ma.array([1,1,1,1,1,1,1], mask=[0,0,1,1,1,1,0])

print x==y           # [True True -- -- -- -- True]
print ma.all(x==y)   # True

当然,这里的使用可能不值得安装和导入 numpy,但在某些情况下它有优势。

于 2013-03-28T04:55:35.850 回答