簡體   English   中英

如何檢查元素是否也在另一個列表中

[英]How to check if an element is also in another list

想象一個函數:

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

但是我不是在尋找元組,而是在尋找整數。 如何打開元組的包裝並進行相同的搜索?

如果您希望能夠給它提供任意數量的列表(而不僅僅是三個),您可能會喜歡:

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

如果要多次(即在多個x s上)檢查這些列表中的成員資格,則需要在開始遍歷x s之前將它們分成一

從最近的編輯看來,您似乎還希望能夠在x傳遞多個項目。 該代碼為:

def inAll(xs, *lsts):
    return all(all(x in l for x in xs) for l in lsts)
 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

做這樣的最好的方法是使用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

最好事先將列表轉換為集合,但是將轉換條件插入函數內部很容易(但是,如果您有很多這樣的控件,請保留集合的副本)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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