下面描述了在Python中如何确定一个列表(数组)是否有重复的元素(所有元素都是唯一的/unique),分别是以下情况。
- 对于一个元素中没有列表的列表
- 对于有元素列表的列表(二维数组,列表的列表,等等)
请参阅下面的文章,了解如何从列表中删除或提取重复的元素。
注意,列表可以存储不同类型的数据,与数组有严格的区别。如果你想在需要内存大小和内存地址的过程中处理数组,或者对大数据进行数值处理,请使用array(标准库)或NumPy。
确定列表中是否有重复的元素(如果该元素没有列表)。
如果该元素没有可更新的对象,如列表,则使用set集类型的构造函数set()。
set类型是一种没有重复元素的数据类型。当一个列表被传递给构造函数set()时,重复的值会被忽略,并返回一个只有唯一值作为元素的set类型的对象。
这个集合类型对象和原始列表中的元素数量被获得,并使用内置函数len()进行比较。
- 如果元素的数量相等,那么在原始列表中就没有重复的元素。
- 如果元素的数量不同,重复的元素会被包含在原始列表中
如果没有重复的元素则返回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
这个例子是一个列表,但同样的函数也可以用于图元。
可变的(可更新的)对象如列表不能成为类型集合的元素。因此,以列表为元素的列表(二维数组、列表的列表等)将导致一个 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()。此外,当对一个三个或更多维度的列表进行扁平化时,有必要定义一个新的函数。