我有一個類中的鍵系結串列,如下所示:
self.key_bind_list = [["A", "B"], ["C"], ["SHIFT", "NUM6", "NUM7"], ["A", "B"], ["A", "B", "C"]]
*在這種情況下,子串列應該檢測到重復["A", "B"],而不是["A", "B"]and["A", "B", "C"]
而且我想檢查主串列上是否有任何重復項(假設每個子串列中的鍵都是唯一的,順序并不重要,我不需要知道哪些不是唯一的)
我試過在下面使用set方法:
if(len(self.key_bind_list) != len(set(self.key_bind_list))):
這給了我一個unhashable type: 'list'錯誤。
uj5u.com熱心網友回復:
假設您只想檢查是否有重復項,并列印出哪些子串列包含重復項,您可以使用包含set元素的串列的方法,例如:
key_bind_list = [["A", "B"], ["C"], ["SHIFT", "NUM6", "NUM7"], ["B", "A"], ["A", "B", "C"]]
seen = []
for i, sublist in enumerate(key_bind_list):
s = set(sublist)
if s in seen:
print(f'index {i}: there are duplicates in {sublist}')
seen.append(s)
輸出:
index 3: there are duplicates in ['B', 'A']
如果串列中的任何子串列與另一個子串列重復(無論順序如何),只需回傳一個bool值,您可以執行以下操作:
def has_duplicates(L: list[list]) -> bool:
seen = []
for sublist in L:
s = set(sublist)
if s in seen:
return True
seen.append(s)
return False
print(has_duplicates(key_bind_list))
uj5u.com熱心網友回復:
使用collections.Counter. 它非常適合建模多重集。要繞過unhashable type錯誤,tuple需要強制轉換,但它使匹配對子串列的排序敏感!
from collections import Counter
lst = [["A", "B"], ["C"], ["SHIFT", "NUM6", "NUM7"], ["A", "B"]]
c = Counter(map(tuple, lst))
for k, v in c.items():
if v > 1:
print(k, v)
通過使用集合相等標準檢查所有對,即所有項都等于某個順序:
from itertools import combinations
lst = [["A", "B"], ["C"], ["SHIFT", "NUM6", "NUM7"], ["A", "B"], ["A", "B", "C"]]
for s1, s2 in combinations(map(set, lst), 2):
if s1 == s2:
print(s1)
#{'A', 'B'}
uj5u.com熱心網友回復:
len(set([tuple(sorted(x)) for x in L])) != len(L)
回傳True表示串列串列中有重復項。
輸出:
>>> L = [["A", "B"], ["C"], ["SHIFT", "NUM6", "NUM7"], ["A", "B"], ["A", "B", "C"]] >>> print(len(set([tuple(sorted(x)) for x in L])) != len(L)) True >>> L = [['A', 'B'], ['C'], ['SHIFT', 'NUM6', 'NUM7'], ['A', 'B', 'C']] >>> print(len(set([tuple(sorted(x)) for x in L])) != len(L)) False >>> L = [["A", "B"], ["C"], ["SHIFT", "NUM6", "NUM7"], ["B", "A"], ["A", "B", "C"]] >>> print(len(set([tuple(sorted(x)) for x in L])) != len(L)) True
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/522679.html
標籤:Python列表排序句法
上一篇:貓鼬按填充欄位排序
