![](/img/trans.png)
[英]How to compare elements in a list of lists and compare keys in a list of lists in 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.