簡體   English   中英

在列表中查找特定模式

[英]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]

這種類型的問題非常適合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,但在某些情況下它具有優勢。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM