问题历史:
类型set(集合)是在Python 2.4中添加的,提供了一种方便且快速的方式来存储唯一的不可变元素,并支持集合论运算(并集、交集等)。集合是基于哈希表实现的。
问题: 许多用户无法理解set和list之间的区别,集合中元素存储的特点(无序性,只有可哈希对象),以及使用集合来优化搜索、检查唯一性或处理大型数据集的细节。
解决方案:
Set是一个可变的、无序的唯一可哈希对象的容器。支持快速的成员测试、并集、交集、差集和对称差集操作。内置的方法包括:add、remove、discard、update、intersection、difference、union、symmetric_difference等。
代码示例:
nums = {1, 3, 5, 7} nums.add(9) nums.update([5, 10]) # 5已经存在,只有10会被添加 other = {3, 9, 11} inter = nums & other # 交集 {3, 9} # 检查成员——比list更快 y = 11 if y in nums: print('存在!')
关键特点:
in非常快速(平均O(1)),而列表为O(n)。可以将列表或其他set添加到set中吗?
回答:不,可以添加的只有可哈希(不可变)对象:字符串、数字、元组。列表和集合是可变的,不能被添加。
代码示例:
s = set() s.add([1, 2]) # TypeError: unhashable type: 'list' s.add((1, 2)) # 好
set中remove方法和discard方法有什么区别?
回答:remove(value)如果未找到value,会引发KeyError异常。discard(value)如果没有这个元素,静默无操作。
代码示例:
s = {1, 2, 3} s.remove(4) # KeyError s.discard(4) # 没有错误
空集合{}是set对象吗?
回答:不是。字面量{}始终是一个空的dict。要创建空的set,必须使用set()函数。
代码示例:
empty_set = {} # 这是dict empty_set_real = set() # 这是set
负面案例
尝试在列表中存储唯一对象,并通过"in"进行检查以查找大型数据集中的重复。
优点:
缺点:
正面案例
使用set来查找交集和大数组中的唯一数据(例如,电子邮件发送),此时不产生重复,且操作快速。
优点:
缺点: