簡體   English   中英

如何比較 Python 中的列表列表?

[英]How to compare list of lists in Python?

我有 2 個列表,如下所示:

a=[[1,0,1,0,1],[0,0,0,1,0],[1,1,0,0,0]]
b=[[1,0,0,0,1],[0,1,0,1,0],[1,1,0,1,0]]

如果 b 中的所有子列表都存在於 a 中,我想返回 true,反之亦然。 這意味着 a 應該等於 b 但子列表的索引可以不同。 例如:

a=[[1,0,1,0,1],[0,0,0,1,0],[1,1,0,0,0]]
b=[[1,0,1,0,1],[1,1,0,0,0],[0,0,0,1,0]]

以上 a 和 b 是相等的,比較應該返回 true。 此外,子列表將僅包含 1 或 0 的組合。 我如何比較它們? 我嘗試將它們轉換為集合:set(a) 但這會引發錯誤。 除此之外,當我在 while 循環中嘗試以下代碼時,它給出了錯誤

a=[[1,0,1,0,1],[0,0,0,1,0],[1,1,0,0,0]]
b=[[1,0,1,0,1],[1,1,0,0,0],[0,0,0,1,0]]

def sublists_equal(a, b):
    return all(l for l in b if l in a)

print(sublists_equal(a, b))

錯誤是:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

我嘗試打印兩個數組以查看問題所在,它們的打印方式如下:

[[0 1 0 1 0]
 [0 1 1 1 1]
 [0 0 0 0 1]
 [0 1 0 0 0]]
[array([0, 1, 0, 1, 0]), array([0, 0, 0, 0, 1]), array([0, 1, 1, 1, 1]), array([0, 1, 0, 0, 0])]

您可以使用all()內置函數來檢查是否可以在a找到b所有子列表l

a=[[1,0,1,0,1],[0,0,0,1,0],[1,1,0,0,0]]
b=[[1,0,1,0,1],[1,1,0,0,0],[0,0,0,1,0]]

def sublists_equal(a, b):
    return all(l for l in b if l in a)

print(sublists_equal(a, b))

如果您想使用集合,您必須將每個子列表轉換為一個元組,這是一種可散列類型,然后比較它們由^運算符表示的對稱差異,該運算符返回兩個列表中未找到的元素集。 如果對稱差異是空set() ,使用not運算符將其否定為True ,則列表具有相等的子列表。

def sublist_equal2(a, b):
    return not set([tuple(l) for l in a]) ^ set([tuple(l) for l in b])

print(sublist_equal2(a, b))

輸出:

True

最簡單的方法是在比較列表之前對列表進行排序:

def compare_lists(a, b):
    return sorted(a) == sorted(b)

這處理存在重復值的情況。

如果重復無關緊要,並且子列表僅包含 1 和 0,則可以將它們轉換為整數:

def sublists_to_integers(lst):
    return [int(''.join(str(i) for i in item), 2) for item in lst]

def compare_lists(a, b):
    return set(sublists_to_integers(a)) == set(sublists_to_integers(b))

這取決於您的列表大小可能會更快和/或使用更少的內存。

暫無
暫無

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

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