Python集:什么、为什么和如何Python带有几种内置数据类型来帮助我们组织数据。这些结构包括列表、字典、元组和集合。根据Python3文档:集合是没有重复元素的无序集合。基本用途包括成员资格测试和消除重复条目。集合对象还支持数学运算,例如并集、交集、差集和等价差集。在本文中,我们将回顾并查看上述定义中列出的每个元素的示例。让我们马上开始,看看如何创建它。初始化集合创建集合有两种方法:一种是向内置函数set()提供元素列表,另一种是使用花括号{}。使用内置函数set()来初始化一个集合:>>>s1=set([1,2,3])>>>s1{1,2,3}>>>type(s1)使用{}:>>>s2={3,4,5}>>>s2{3,4,5}>>>type(s2)>>>如你所见,这两种方法都是有效的。但问题是,如果我们想要一个空集合怎么办?>>>s={}>>>type(s)是的,如果我们使用空花括号,我们将得到一个字典而不是一个集合。=)值得一提的是,为简单起见,本文中的所有示例都将使用整数集合,但集合可以包含Python支持的所有可散列数据类型。换句话说,整数、字符串和元组,而不是像列表或字典这样的可变类型。>>>s={1,'coffee',[4,'python']}回溯(最近调用最后):文件“”,第1行,在TypeError:unhashabletype:'list'现在您知道了如何创建一个集合以及它可以包含哪些类型的元素,让我们继续讨论为什么我们应该始终将它放在我们的工具箱中。当您可以通过多种方式编写代码时,为什么需要使用它来编写代码。有些被认为很糟糕,有些则清晰、简洁且可维护,或者是“Pythonic方式的Pythonic”。根据Hitchhiker对Python的建议:当有经验的Python开发者(Pythonista)调用一些不够“pythonic”的代码时,他们通常会认为代码不遵循通用的准则,不能被认为是表达意图的好方法(可读性).让我们开始探索Python集合如何不仅可以帮助我们提高可读性,还可以加快程序执行时间。无序集合元素您需要了解的第一件事是您不能使用索引来访问集合中的元素。>>>s={1,2,3}>>>s[0]Traceback(最后一次调用):文件“”,第1行,在TypeError中:'set'对象不支持使用切片索引或修改它们:>>>s[0:2]Traceback(最近一次调用最后一次):文件“”,第1行,在TypeError:'set'objectisnotsubscriptable但是,如果我们需要删除重复项,或者像组合列表(和)那样进行数学运算,然后我们可以而且应该始终使用集合。我不得不提到集合在迭代时优于列表。所以,如果你需要它,加深你对它的爱。为什么?好吧,这篇文章并不是要解释集合的内部工作原理,但如果您有兴趣,可以通过以下链接阅读它:时间复杂度set()是如何实现的?Python集与列表使用集而不是列表来确保尽可能最好的列表条目有什么优点或缺点吗?没有重复在写这篇文章时我一直在想,我经常使用for循环和if语句来检查和删除列表中的重复元素。记得当时脸红了,不止一次,我这样写代码:>>>my_list=[1,2,3,2,3,4]>>>no_duplicate_list=[]>>>foriteminmy_list:...如果项目不在no_duplicate_list中:...no_duplicate_list.append(item)...>>>no_duplicate_list[1,2,3,4]或使用列表理解:>>>my_list=[1,2,3,2,3,4]>>>no_duplicate_list=[]>>>[no_duplicate_list.append(item)foriteminmy_listifitemnotinno_duplicate_list][None,None,None,None]>>>no_duplicate_list[1,2,3,4]但没关系,因为我们现在有了武器,其他都不重要:>>>my_list=[1,2,3,2,3,4]>>>no_duplicate_list=list(set(my_list))>>>no_duplicate_list[1,2,3,4]>>>现在让我们使用timeit模块,看看列表和集合在删除重复项时如何执行:>>>fromtimeitimporttimeit>>>defno_duplicates(列表):...no_duplicate_list=[]...[no_duplicate_list。如果项目不在no_duplicate_list中,则为列表中的项目追加(项目)...返回no_duplicate_list。..>>>#首先,让我们看看列表是如何工作的:>>>print(timeit('no_duplicates([1,2,3,1,7])',globals=globals(),number=1000))0.0018683355819786227>>>fromtimeitimporttimeit>>>#useset:>>>print(timeit('list(set([1,2,3,1,2,3,4]))',number=1000))0.0010220493243764395>>>#Fastandclean=)使用集合而不是列表理解不仅可以让我们编写更少的代码,还可以让我们获得更具可读性和性能的代码注意:记住集合是无序的,所以不能保证将元素转换回列表时,元素的顺序不会改变。Python之禅:美胜于丑。美丽总比丑陋好。显式优于隐式。简单胜于复杂。扁平比嵌套好。扁平比嵌套好,清晰,简单和平坦?成员资格测试每次我们使用if语句来检查一个元素,例如,如果它在列表中,则意味着您正在进行成员资格测试:my_list=[1,2,3]>>>if2inmy_list:...print('是的,这是一个会员测试!')...是的,这是一个会员测试!在执行这些操作时,集合比列表更有效:>>>fromtimeitimporttimeit>>>defin_test(iterable):...foriinrange(1000):...ifiiniterable:...pass...>>>timeit('in_test(iterable)',...setup="from__main__importin_test;iterable=list(range(1000))",...number=1000)12.459663048726043>>>从timeitimporttimeit>>>defin_test(iterable):...foriinrange(1000):...ifiiniterable:...pass...>>>timeit('in_test(iterable)',...setup="from__main__importin_test;iterable=set(range(1000))",...number=1000).12354438152988223注意:上面的测试来自这个StackOverflow线程所以如果你在一个巨大的列表上进行这样的比较,尝试将该列表转换为一个集合,它应该可以加快你的速度。如何使用现在你明白了什么是集合以及为什么要使用它,让我们快速看一下我们如何修改和操作它添加元素根据我们要添加的元素数量,我们要在add()和update()方法之间选择。add()适用于添加单个元素:>>>s={1,2,3}>>>s.add(4)>>>s{1,2,3,4}update()适用于添加多个元素:>>>s={1,2,3}>>>s.update([2,3,4,5,6])>>>s{1,2,3,4,5,6}Rememberthatsetsremoveduplicates.Removeelements如果你想在你的代码试图删除一个不在集合中的元素时得到提醒,使用remove().否则,discard()提供了一个很好的选择:>>>s={1,2,3}>>>s.remove(3)>>>s{1,2}>>>s.remove(3)Traceback(最近调用最后):文件“”,第1行,在KeyError中:3discard()不会导致任何错误:>>>s={1,2,3}>>>s.discard(3)>>>s{1,2}>>>s.discard(3)>>>#什么都不会发生我们也可以使用pop()随机丢弃一个元素:>>>s={1,2,3,4,5}>>>s.pop()#删除任意元素1>>>s{2,3,4,5}或clear()方法清空一个集合:>>>s={1,2,3,4,5}>>>s.clear()#清除集合>>>sset()union()union()or|将创建一个包含我们提供的所有元素的新集合:>>>s1={1,2,3}>>>s2={3,4,5}>>>s1.union(s2)#or's1|s2'{1,2,3,4,5}intersection()intersectionor&将返回公共元素的集合:>>>s1={1,2,3}>>>s2={2,3,4}>>>s3={3,4,5}>>>s1.intersection(s2,s3)#或's1&s2&s3'{3}difference()使用difference()或-创建一个新集合,其值在“s1”中但不在“s2”中:>>>s1={1,2,3}>>>s2={2,3,4}>>>s1。difference(s2)#or's1-s2'{1}symmetric_diference()symmetric_differenceor^将返回集合之间的不同元素>>>s1={1,2,3}>>>s2={2,3,4}>>>s1.symmetric_difference(s2)#or's1^s2'{1,4}结论希望读完这篇文章后,你会知道什么是集合,如何操作它的元素以及它能做什么。知道何时使用集合无疑会帮助您编写更清晰的代码并加快您的程序。如果您有任何问题,请发表评论,我很乐意尝试回答。另外,请不要忘记,如果您已经了解集合,它们在Python备忘单中占有一席之地,您可以在其中快速参考并重新学习您已经知道的内容。