確定列表(數組)是否在 Python 中具有重複元素

商業

以下是如何在 Python 中確定列表(數組)是否具有重複元素(所有元素都是唯一/唯一)的描述,針對以下每種情況。

  • 對於元素中沒有列表的列表
  • 對於具有元素列表的列表(二維數組、列表列表等)

請參閱以下文章,了解如何從列表中刪除或提取重複元素。

請注意,列表可以存儲不同類型的數據,並且與數組完全不同。如果要在需要內存大小和內存地址的進程中處理數組或對大數據進行數值處理,請使用數組(標準庫)或 NumPy。

判斷列表中是否有重複元素(如果元素沒有列表)

如果元素沒有列表等可更新對象,則使用 set set 類型的構造函數 set()。

集合類型是沒有重複元素的數據類型。將列表傳遞給構造函數 set() 時,將忽略重複值並返回僅具有唯一值作為元素的 set 類型的對象。

使用內置函數 len() 獲取並比較此 set 類型對像中的元素個數和原始列表。

  • 如果元素個數相等,則原始列表中沒有重複元素
  • 如果元素數量不同,則將重複元素包含在原始列表中

如果沒有重複元素返回false,如果有重複元素返回true的函數如下

def has_duplicates(seq):
    return len(seq) != len(set(seq))

l = [0, 1, 2]
print(has_duplicates(l))
# False

l = [0, 1, 1, 2]
print(has_duplicates(l))
# True

這個例子是一個列表,但同樣的函數也可以用於元組。

諸如列表之類的可變(可更新)對像不能是 set 類型的元素。因此,以列表為元素的列表(二維數組、列表列表等)將導致 TypeError。對策如下所示。

l_2d = [[0, 1], [1, 1], [0, 1], [1, 0]]
# print(has_duplicates(l_2d))
# TypeError: unhashable type: 'list'

判斷列表中是否有重複元素(如果元素有列表)

對於帶有元素列表的列表(例如列表列表),可以使用以下函數來確定是否存在重複元素。

def has_duplicates2(seq):
    seen = []
    unique_list = [x for x in seq if x not in seen and not seen.append(x)]
    return len(seq) != len(unique_list)

l_2d = [[0, 0], [0, 1], [1, 1], [1, 0]]
print(has_duplicates2(l_2d))
# False

l_2d = [[0, 0], [0, 1], [1, 1], [1, 1]]
print(has_duplicates2(l_2d))
# True

列表推導表示法不是 set(),而是生成一個列表,其元素僅為唯一值,並比較元素的數量。有關詳細信息,請參閱以下文章。

此函數也適用於沒有元素列表的列表。

l = [0, 1, 2]
print(has_duplicates2(l))
# False

l = [0, 1, 1, 2]
print(has_duplicates2(l))
# True

到目前為止的示例是確定元素列表是否重複(包含相同的列表)。

將原始列表展平為一維後,可以確定每個列表的元素是否重疊。

l_2d = [[0, 1], [2, 3]]
print(sum(l_2d, []))
# [0, 1, 2, 3]

print(has_duplicates(sum(l_2d, [])))
# False

l_2d = [[0, 1], [2, 0]]
print(has_duplicates(sum(l_2d, [])))
# True

這裡使用 sum() 來展平列表,但也可以使用 itertools.chain.from_iterable()。此外,在展平三個或更多維度的列表時,需要定義一個新函數。