簡體   English   中英

使用列表推導比較兩個數組的元素

[英]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的每個元素為Trueall()返回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.

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