簡體   English   中英

如何在python中比較兩個列表的每個元素

[英]How to compare each element of two lists in python

我正在尋找一個類似於R中%in%的Python運算符。它將一個列表中的所有元素與另一個列表中的所有元素進行比較,並返回一個布爾數組。 它將執行以下操作:

a=['word1','word2','word3','word4']
b=['word2','word4']
a *%in%* b
>>False True False True

我找到的最接近的東西是pd.str.contains,但沒有向量化,即它只查找一個元素。 希望有人知道。

清單理解:

[item in b for item in a]

這將以類似於以下代碼的方式創建一個新列表:

newList = []
for item in a:
    newList.append(item in b)

其中, item in b的計算結果為True ,如果item中存在b ,否則會評估為False


如評論中所述(感謝Paul Rooney !),如果將b設為集合,則可以提高此速度:

b_set = set(b)
result = [item in b_set for item in a]

這是因為,如果b是一個集合,則b的查找操作item in b將花費一致的時間,而如果b是一個列表,則必須比較每個單個項,直到找到匹配的項為止。

如果b小,則速度改進不是很明顯,但是對於包含數百個元素的列表b ,這可能是令人討厭的改進。

因為python並不是主要的數字語言或科學語言,所以它並沒有在Matlab或R中默認提供某些功能。也就是說,numpy / scipy生態系統幾乎提供了所有這些語言所需的功能。 例如,numpy具有in1d函數:

import numpy
a = ['word1','word2','word3','word4']
b = ['word2','word4']

print(numpy.in1d(a, b))
# [False  True False  True]

使用列表理解 ,我們可以檢查產品的list比較,並返回True如果是別的False

l = [*True if i in b else False for i in a]
print(*l)
 False True False True 

擴大循環

l = []
for i in a:
    if i in b:
        l.append(True)
    else:
        l.append(False)

暫無
暫無

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

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