[英]Finding specific patterns in a list
我正在嘗試制定一個功能以在列表中查找特定模式。 例如,如果我們拿清單
x = [1,1,2,3,54,3,1]
然后,我想檢查模式y是否出現在列表x中:
y = [1,1,n,n,n,n,1]
其中n代表任何數字。 因此,在我的示例中,它將返回True 。
我已經研究了any()函數,但無法進行很多工作。
>>> from operator import itemgetter
>>> x = [1, 1, 2, 3, 54, 3, 1]
>>> itemgetter(0,1,6)(x) == (1, 1, 1)
True
如何y
真正定義。 顯然,你不能有n
在那里作為占位符? 可以將您的使用None
可能?
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
手段感到困惑。 它用於檢查值的序列,並查看它們中的任何一個是否為“ true”。 這與確定值是“任何數字”還是“這些可能性中的任何一個”無關。
如果你有一個固定的,有限的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)
)
根據您的模式的細節,有更有效的匹配方法,這些方法將受到字符串搜索算法和正則表達式引擎的啟發。 但這正在涉及難度更大的材料-上面的內容應該使您入門。
我認為您想搜索模式匹配的列表。
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]
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)])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.