![](/img/trans.png)
[英]how to check whether a list element is in another list but also at the same index
[英]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.