python语言,set和list有什么区别?set和list如何相互转化?
发布于 作者:苏南大叔 来源:程序如此灵动~
各种高级编程语言里面,都有set和list这两种和array非常类似的数据类型。事实上,两者是有区别的。在不同的应用场景下,使用set还是list,都是有所区分的。set如何转化为list?list又如何转化为set?这些都是本文中主要阐述的问题。

大家好,这里是苏南大叔的“程序如此灵动”博客,这里讲述苏南大叔和计算机代码的故事。本文讲述在python语言中的set和list的区别。测试环境:win10,python@3.6.8。
简要说明
在苏南大叔的理解中,
set集合函数,自带unique属性,自带去重光环,并且没有排序,内部数据输出随机,整体输出的是个对象{},内部不可以全部传递数字。list列表类型,成员可以重复,成员之间有排序,数据输出按顺序输出,是个堆栈[]。
定义如下:
_set = set()
_set = set([1,2,3])
_set = set(["sunan","is","best"])
_set = {"sunan","is","best"}_set = set("uncle sunan")
_set = set(1) ## 报错
set()可以传一个参数,或者不传参数。参数可以是字符串(会被随机打乱输出),也可以是数组。但是不能是数字,否则报错:
TypeError: 'int' object is not iterablelist比较简单,类似于数组[],有顺序不会被打乱。
_list = []
_list = ["sunan","is","best"] 添加成员
_set.add("s")
_list.append("s")这里需要注意的是:set自带distinct功能,任何数据添加进去后,只接受新的未知数据,重复数据不会报错。也就是说,上述语句如果执行多次的话,set内只会有一个s,而list内会有多个s。
去重对比:
_set = set()
_list = []
for i in "aaabbc":
_set.add(i)
_list.append(i)
print(_set,_list)
删除成员
_set = {"a","b","c","d","e"}
_list = ["a","b","c","d","e"]
_set.remove("a")
_list.remove("a")
_item_set = _set.pop()
_item_list = _list.pop(2)
print(_set,_list)
print(_item_set,_item_list)特别说明的是:.pop()这个是典型的堆栈操作。
- set 随机
pop,不一定pop出谁。 - list 只是
pop出指定位置的元素。第二次执行的时候,需要注意索引已经变化。

包含判断
两者都可以使用in做存在性判断,但是注意int和string的区别。
_set = {9,5,2,7}
_list = [9,5,2,7]
print ("7" in _set)
print (7 in _set)
print ("a" in _list)
修改成员
set因为无序,所以没有索引的概念,也就无法角标修改成员。不过它天生去重,所以可以先remove,再add,效果就是修改了。
_set = {"a","b","c"}
_dict ={"b":"e"}
_target = "b"
if (_target in _set) and (_dict[_target] not in _set):
_set.remove(_target)
_set.add(_dict[_target])
print(_set)
else:
print("修改失败")
_list[0] = "sunan"
相互转化
list和set是可以相互转化的,但是由于set具有天然去重的特性,所以相互转化的过程中可能会碰到数据丢失的问题。
_list = ["a","a","b"]
_set = set(_list)
_list = list(_set)
排序问题
list可以排序,set天生无序所以无法排序,强制排序后变list。
_list = [9,5,2,7]
# _list2 = _list.sort() #没有返回值
_list.sort()
print(_list)
_set = set(_list)
# _set.sort() # 报错 AttributeError: 'set' object has no attribute 'sort'
_list3 = sorted(_set) # 有返回值
print(_set,type(_list3),_list3)
成员遍历
两者都可以使用for..in循环输出。测试代码如下:
_set = {9,5,2,7}
_list = [9,5,2,7]
for i in _set:
print(i)
for i in _list:
print(i)
合并成字符串
python里面的字符串join合并,是极其十分非常的特殊,强烈鄙视!和其它的高级编程语言完全对着干。
# _set = {9,5,2,7}
# _list = [9,5,2,7]
_set = {"sunan","is","best"}
_list = ["sunan","is","best"]
_str1 = " ".join(_list) #TypeError: sequence item 0: expected str instance, int found
_str2 = " ".join(_set)
print(_str1)
print(_str2)
_set.add(1)
_list.append(1)
_str1 = " ".join('%s' %id for id in _set)
_str2 = " ".join('%s' %id for id in _list)
print(_str1)
print(_str2)而且set或者list中出现数字类型的话,就直接报错。真是傲娇的小公主~
TypeError: sequence item 0: expected str instance, int found解决方案就是:
" ".join('%s' %id for id in _set)
整体来说,这个join测试就是大跌眼镜啊...参考文献
综述
本文从各大方面比较了常见的set和list的用法,本文是以python为例的,在其它语言里面,是否有一些变化,情况未知,待议。不过,本文对于其它高级编程语言,也应该具有一定的参考意义。