我试图找出一个函数来查找列表中的特定模式。例如,如果我们把名单查找列表中的特定模式
x = [1,1,2,3,54,3,1]
我想要再检查模式Y在列表X显示出来:
y = [1,1,n,n,n,n,1]
其中n表示任何数量。所以在我的例子中,它会返回True。
我查看了any()函数,但我一直无法工作太多。
我试图找出一个函数来查找列表中的特定模式。例如,如果我们把名单查找列表中的特定模式
x = [1,1,2,3,54,3,1]
我想要再检查模式Y在列表X显示出来:
y = [1,1,n,n,n,n,1]
其中n表示任何数量。所以在我的例子中,它会返回True。
我查看了any()函数,但我一直无法工作太多。
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))]
或多个代码容易理解:
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)]
我想你是无所适从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-28 05:11:27
我想你想搜索一个模式匹配的列表。
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]
这种类型的问题是非常适合Numpymasked arrays:
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的,但它在某些情况下有优势。
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)])
那么,我在这个问题上没有看到关于子列表的任何内容。 – zen11625 2013-03-28 08:14:29
你得到的前三个答案的差异说明了你所问的含糊不清。我试图覆盖所有的基地。 – 2013-03-28 04:23:01