![](/img/trans.png)
[英]Populate two arrays of random length, with random numbers, using a list comprehension
[英]Using list comprehension to compare elements of two arrays
如何在python中使用列表推導比較兩個數組是否具有相同的元素?
我做了以下事情:
>>> aa=[12,3,13];
>>> bb=[3,13,12];
>>> pp=[True for x in aa for y in bb if y==x]
>>> pp
[True, True, True]
>>> bb=[3,13,123];
>>> pp=[True for x in aa for y in bb if y==x]
[True, True]
我也想輸出False(如果不是真的),而不是像后一種情況那樣只輸出兩個true,但不知道如何做。
最后,我想獲得一個True / False值(如果全部為true,則為true,如果其中之一為false,則為false),而不是true和/或false的列表。 我知道一個簡單的循環遍歷pp(真假列表)就足夠了,但是我確信有更多的Python方式可以做到這一點。
您正在將每個列表的每個元素與另一個列表的每個元素進行測試,找到所有True
組合。 除了效率低下之外,這也是不正確的方法。
請使用成員資格測試,並使用all()
函數查看所有這些測試為True
:
all(el in bb for el in aa)
如果給定的iterable的每個元素為True
則all()
返回True
,否則為False
。
這不會完全測試列表是否相等。 您還需要測試長度:
len(aa) == len(bb) and all(el in bb for el in aa)
對於較長的bb
列表,使其更有效率; 首先從該列表創建一個set()
:
def equivalent(aa, bb):
if len(aa) != len(bb):
return False
bb_set = set(bb)
return all(el in bb_set for el in aa)
這仍然不能很好地處理重復的數字。 [1, 1, 2]
等效於此方法的[1, 2, 2]
。 您沒有充分說明在這種極端情況下會發生什么; 唯一嚴格的等效測試是對兩個輸入進行排序:
len(aa) == len(bb) and sorted(aa) == sorted(bb)
我們首先測試長度,以避免長度不同時進行排序。
如果允許重復,無論輸入長度如何,都可以完全放棄循環,而只使用set:
not set(aa).symmetric_difference(bb)
測試它們是否具有相同的獨特元素。
set(aa) == set(bb)
這具有相同的效果,但可能會稍快
not set(aa).symmetric_difference(bb)
如果您需要[1,1]
不等於[1]
請執行
sorted(aa) == sorted(bb)
“您正在將每個列表的每個元素與另一個列表的每個元素進行測試,找到所有正確的組合。除了效率低下之外,這也是不正確的方法。”
我同意上面的聲明,下面的代碼也列出了False
值,但我不認為您真的需要這個。
>>> bp = [y==x for x in aa for y in bb]
[False, False, True, True, False, False, False, True, False]
>>> False in bp
True
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.