2014-12-07 37 views
-2

我有一個列表的列表(200)包含不同的字符串:快速查找列表的方法包含兩個特定項目?

lists = [ 
    ['a', 'b', 'c', 'g', ...], 
    ['b', 'c', 'f', 'a', ...], 
    ... 
] 

現在我想找出所有包含兩個給出的字符串,給定的順序名單。

例如,給定('a', 'g'),['a', 'b', 'c', 'g', ...]將被匹配。

這樣做的pythonic方式是什麼?

+0

爲什麼downvotes? – wong2 2014-12-07 14:12:33

+1

這是一個微不足道的問題。這沒有任何研究工作。 – simonzack 2014-12-07 14:14:30

回答

1

在我看來,最Python的方式是:

selection = [L for L in lists 
      if x1 in L and x2 in L and L.index(x1) < L.index(x2)] 

的缺陷是,它會搜索每個元素兩次,第一次檢查存在(忘記指數)和第二檢查的順序。

另一種可能是

def match(a, b, L): 
    try: 
     return L.index(a) < L.index(b) 
    except ValueError: 
     return False 

selection = [L for L in lists if match(x1, x2, L)] 

但我覺得稍微醜陋,除非性能是一個問題,我不會使用它。

相反,如果所需要的邏輯是接受含有[... x2 ... x1 ... x2 ...]列表則校驗不同的是:

selection = [L for L in lists 
      if x1 in L and x2 in L[L.index(x1)+1:]] 

其翻譯成英文爲「如果x1爲在列表中,X 2是以下的第一X1的部分」如果x1x2的值相同,那麼該功能也可以按預期工作。

+0

太棒了!感謝這 – wong2 2014-12-07 14:16:43

+0

我同意'索引'是最好的方式,但請注意,只有第一次出現的值的索引被返回。所以'match'('h','k',['a','k','h','k'])'返回'False',這可能是也可能不是你想要的。 – 2014-12-07 14:23:08

+0

@ajcr:你說得對。我已經添加了一個版本來處理這個問題,還有'x1 == x2'的情況。 – 6502 2014-12-07 14:35:09

相關問題