2013-03-28 82 views
2

我試圖找出一個函數來查找列表中的特定模式。例如,如果我們把名單查找列表中的特定模式

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

我想要再檢查模式Y在列表X顯示出來:

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

其中n表示任何數量。所以在我的例子中,它會返回True

我查看了any()函數,但我一直無法工作太多。

+3

你得到的前三個答案的差異說明了你所問的含糊不清。我試圖覆蓋所有的基地。 – 2013-03-28 04:23:01

回答

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

如何爲y真的定義。顯然你不能有n作爲佔位符?也許你可以使用None?對於

+0

@ealfonso職位可以改變,OP沒有說明他們是如何給予的。 – jamylak 2013-03-28 05:49:33

+0

職位可以更改,但他們仍然是固定的,他們不能匹配原始的子列表。 – erjoalgo 2013-03-28 06:26:41

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))] 

或多個代碼容易理解:

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)] 
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) 
    ) 

有更有效的方式來匹配,這取決於你的模式的細節,將由字符串搜索算法和正則表達式得到啓發引擎。但是,這正在陷入更困難的材料 - 上面應該讓你開始。

+2

這是...令人難以置信的脆弱。 – 2013-03-28 05:11:27

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] 
0

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

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)]) 
+1

那麼,我在這個問題上沒有看到關於子列表的任何內容。 – zen11625 2013-03-28 08:14:29

相關問題