2012-11-02 204 views
1

試想一個功能:如何檢查元素是否也是另一個列表

def Intersects (x, list1, list2, list3): 
    if x in list1 and x in list2 and x in list3: return True 
    return False 

必須有一個更好的方式來做到這一點,但我不能弄明白。我怎樣才能做到這一點? (性能很重要)

編輯:這次我遇到了一個相關的,然而更難的問題。這次我有3個不相關的整數,我需要測試它們是否相交。

像:

1, 2, 3 <-- elements to look for 
if InAll ((1, 2, 3)) ... 

但我不是找一個元組,而不是我期待的只是整數。如何解開元組並進行相同的搜索?

+2

我不會調用這個函數'相交' - 它檢查是否有一個項目是在每個名單。 –

+0

是的,你可能是對的。 :)我將使用「inAll」 –

+0

@TheConjuring:在下面的評論中,您詢問了「O(1)」和「O(n)」是什麼意思。粗略地說,它是完成操作需要多長時間的度量,是輸入大小的函數。如果一個操作是'O(1)',那麼無論輸入大小如何,都需要一段時間。如果一個操作是'O(n)',那麼它需要一定的時間與輸入的大小成比例(線性)。參見[wikipedia](http://en.wikipedia.org/wiki/Time_complexity)和[這個Python頁面](http://wiki.python.org/moin/TimeComplexity)。 – unutbu

回答

9

如果你希望能夠給它的任何數量的列表(不只是三層),你可能會喜歡:

def inAll(x, *lsts): 
    return all((x in l) for l in lsts) 

如果你正在檢查這些列表中的成員多次(在許多x S,那就是),在開始循環訪問x之前,您需要將每個設置爲set

從最近的編輯看來,您似乎也希望能夠通過x中的多個項目。代碼,這將是:

def inAll(xs, *lsts): 
    return all(all(x in l for x in xs) for l in lsts) 
+0

您可以將生成器表達式傳遞給'all',以便您可以將括號放在列表理解的周圍。 –

+0

@StevenRumbalski:很對,這是一個壞習慣 - 修正了 –

+0

+1:感謝您對我的(刪除的)文章的信息和更正! – unutbu

0
def intersects(x,L1,L2,L3): 
    if not isinstance(x,(list,tuple)): 
      x = [x] 
    return set(x).intersection(L1).intersection(L2).intersection(L3) == set(x) 

應該很多東西

>>> l1 = range(10) 
>>> l2 = range(5,10) 
>>> l3 = range(2,7) 
>>> def intersects(x,L1,L2,L3): 
...  if not isinstance(x,(list,tuple)): 
...    x = [x] 
...  return set(x).intersection(L1).intersection(L2).intersection(L3) == set(x) 
... 
>>> intersects(6,l1,l2,l3) 
True 
>>> intersects((5,6),l1,l2,l3) 
True 
>>> intersects((5,6,7),l1,l2,l3) 
False 
0

做一些事情的最好辦法像這樣工作是使用set ...可能會更即使轉換時間效率高:

def InAll(element_list, *sets): 
    #calculate the intersection between all the sets 
    intersection = reduce(lambda i , j: i & j, sets) 
    #check if every element is in the intersection 
    return all(i in intersection for i in element_list) 


sets = [ set(range(5)), set(range(10)) ] 
InAll([9], *sets) 
#False 

sets = [ set(range(5)), set(range(10)) ] 
InAll([1,3], *sets) 
#True 

最好事先將列表轉換爲集合,但它很容易插入轉換在conde裏面的功能(但如果你有很多這些控件,保留一套的副本)

相關問題