2015-10-16 114 views
2

返回列表中的第一個項目是否也是另一個列表中的項目?目前我使用蠻力和無知做:返回包含在另一個列表中的Python列表中的第一個項目

def FindFirstMatch(a, b): 
    """ 
    Returns the first element in a for which there is a matching 
    element in b or None if there is no match 
    """ 

    for item in a: 
     if item in b: 
      return item 
    return None 

所以FindFirstMatch(['Fred','Wilma','Barney','Betty'], ['Dino', 'Pebbles', 'Wilma', 'Bambam'])回報'Wilma'但我想知道是否有一個更優雅/有效的/ Python的方式。

+0

我不確定Python集合是否可以成爲這裏的途徑,但是我需要將列表A中的第一項與列表B中的任何項匹配,並且我相信Python集合是無序的? – TimGJ

+0

看起來不錯,雖然你不需要明確地返回None。如果元素是可散列的(比如你的字符串),你可以使'b'集合更高效。 – jonrsharpe

+0

>>>的術語是什麼?我無法在文檔中找到它。 – ergonaut

回答

4

您可以使用生成器表達式和'next()'函數。示例 -

def FindFirstMatch(list1, list2): 
    """ 
    Returns the first element in list "list1" for which there is a matching 
    element in list "list2" or None if there is no match 
    """ 

    setb = set(list2) 

    return next((item for item in list1 if item in setb),None) 

如果'list2'中不存在滿足條件的此類項目,這也將返回None

在上述函數中,我首先將列表'list2'轉換爲set,以便可以在恆定時間內完成搜索(否則在list中搜索是O(n)時間複雜度操作)。

+0

甜。我永遠不會想到使用下一個。我想這就是爲什麼stackoverflow非常有用。 – TimGJ

+0

我認爲在「下一個」之前將它轉換爲一個集合並沒有什麼特別的優勢 - 也就是說,它與「下一個返回((集合(b)中的if項目中的項目的項目)無)' – TimGJ

+0

隨着你的版本,它會轉換整個b列表設置每次我們檢查條件時,如果你轉換它設置下一個,它只會被轉換爲設置一次。 –

相關問題