簡體   English   中英

檢查兩個列表中是否有任何共同元素:Python

[英]Check if there is any common element in both lists : Python

所以我正在研究這個簡單的程序來檢查兩個列表中是否有公共元素,所以我編寫的代碼使用嵌套 if 但想知道有沒有更好的方法來做到這一點而不是使用嵌套格式。

def common_data(list1, list2):
     result = False
     for x in list1:
         for y in list2:
             if x == y:
                 result = True
                 return result

還有一種方法可以檢查 n 個列表中的公共元素嗎?

您可以使用any來遍歷一個列表並檢查另一個列表中的包含情況。 這具有在找到第一個包含的元素時短路的好處。

>>> a = [1,2,3,4]
>>> b = [4,5,6,7]
>>> any(i in b for i in a)
True

或者,您可以檢查兩個列表之間的set.intersection的大小

>>> a = [1,2,3,4]
>>> b = [4,5,6,7]
>>> len(set(a).intersection(b)) > 0
True

第一個選項是最簡單的。 您想知道列表 2 中是否有列表 1 中的任何元素。生成器推導幾乎可以直接將英語想法轉化為代碼。 對於大型列表來說效率很低,但它非常容易編碼。

result = any(x in list2 for x in list1)

如果您的元素是可散列的,您可以通過使用集合進行 O(1) 包含查找來改進它。 請注意,我們只想從最小列表中創建一個集合以最小化額外的 memory 並為該操作工作,並且我們使用內置的any()允許它短路並在我們立即在其中找到項目時提前退出清單 2。

if len(list1) > len(list2):
    list1, list2 = list2, list1
cache = set(list1)
result = any(x in cache for x in list2)

如果您的元素不可散列且可排序,另一種選擇是對兩個列表進行排序,合並它們並檢查重復項(這是一個與您的相等定義相匹配的完整順序至關重要 - 當元素不同時,應該是小於另一個)。

值得注意的是,由於所有額外的元組,這具有相當高的 object 創建開銷。 編寫自己的例程來逐步遍歷兩個排序列表並跟蹤前一個元素來自哪個而不是調用heapq.merge()可能值得。

import heapq

list1, list2, prev, result = sorted(list1), sorted(list2), None, False
for item, i in heapq.merge(
        ((x, 1) for x in list1),
        ((x, 2) for x in list2)):
    if prev and item==prev[0] and i!=prev[1]:
        result = True
        break
    prev = (item, i)

可能還值得注意的是,如果您唯一可用的操作是相等性測試(對象不可排序、可散列等),那么對於 len(list1)==,您通常無法改善 O(nm) 之外的最壞情況n 和 len(list2)==m。 仍然有一些有趣的特殊情況(例如,如果唯一元素的數量很少),但是如果您沒有關於該問題的一些額外信息,那么您將無法比簡單的解決方案做得更好。

如果元素是可散列的......

更短的表達:

>>> list1 = [1, 2, 3]
>>> list2 =    [2, 3, 4]
>>> bool(set(list1) & set(list2))
True

對於您的“n 個列表”問題:

>>> lists = [[1, 2, 3, 4, 5],
                [2, 3, 4, 5, 6],
                   [3, 4, 5, 6, 7],
                      [4, 5, 6, 7, 8]]
>>> bool(set(lists[0]).intersection(*lists))
True

當然,如果您只想在 boolean 上下文中使用它,例如if... : ,您可能不需要顯式轉換為bool :或者如果您確實想知道常見元素:

>>> if set(list1) & set(list2):
        print('common!')

common!

>>> set(list1) & set(list2)
{2, 3}

>>> set(lists[0]).intersection(*lists)
{4, 5}

暫無
暫無

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

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