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 iterable
list
比较简单,类似于数组[]
,有顺序不会被打乱。
_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
为例的,在其它语言里面,是否有一些变化,情况未知,待议。不过,本文对于其它高级编程语言,也应该具有一定的参考意义。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。