各种高级编程语言里面,都有setlist这两种和array非常类似的数据类型。事实上,两者是有区别的。在不同的应用场景下,使用set还是list,都是有所区分的。set如何转化为listlist又如何转化为set?这些都是本文中主要阐述的问题。

苏南大叔:python语言,set和list有什么区别?set和list如何相互转化? - list-vs-set
python语言,set和list有什么区别?set和list如何相互转化?(图11-1)

大家好,这里是苏南大叔的“程序如此灵动”博客,这里讲述苏南大叔和计算机代码的故事。本文讲述在python语言中的setlist的区别。测试环境:win10python@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

苏南大叔:python语言,set和list有什么区别?set和list如何相互转化? - set定义方式
python语言,set和list有什么区别?set和list如何相互转化?(图11-2)

_list = []
_list = ["sunan","is","best"] 

list比较简单,类似于数组[],有顺序不会被打乱。

添加成员

_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)

苏南大叔:python语言,set和list有什么区别?set和list如何相互转化? - set去重
python语言,set和list有什么区别?set和list如何相互转化?(图11-3)

删除成员

_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出指定位置的元素。第二次执行的时候,需要注意索引已经变化。

苏南大叔:python语言,set和list有什么区别?set和list如何相互转化? - 删除元素
python语言,set和list有什么区别?set和list如何相互转化?(图11-4)

包含判断

_set = {9,5,2,7}
_list = [9,5,2,7]
print ("7" in _set)
print (7 in _set)
print ("a" in _list)

苏南大叔:python语言,set和list有什么区别?set和list如何相互转化? - 存在性判断
python语言,set和list有什么区别?set和list如何相互转化?(图11-5)

修改成员

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("修改失败")

苏南大叔:python语言,set和list有什么区别?set和list如何相互转化? - set无法直接修改
python语言,set和list有什么区别?set和list如何相互转化?(图11-6)

_list[0] = "sunan"

苏南大叔:python语言,set和list有什么区别?set和list如何相互转化? - list修改
python语言,set和list有什么区别?set和list如何相互转化?(图11-7)

相互转化

listset是可以相互转化的,但是由于set具有天然去重的特性,所以相互转化的过程中可能会碰到数据丢失的问题。

_list = ["a","a","b"]
_set = set(_list)
_list = list(_set)

苏南大叔:python语言,set和list有什么区别?set和list如何相互转化? - 数据丢失
python语言,set和list有什么区别?set和list如何相互转化?(图11-8)

排序问题

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)

苏南大叔:python语言,set和list有什么区别?set和list如何相互转化? - 排序对比
python语言,set和list有什么区别?set和list如何相互转化?(图11-9)

成员遍历

_set = {9,5,2,7}
_list = [9,5,2,7]
for i in _set:
    print(i)
for i in _list:
    print(i)

苏南大叔:python语言,set和list有什么区别?set和list如何相互转化? - 成员遍历都用for-in
python语言,set和list有什么区别?set和list如何相互转化?(图11-10)

合并成字符串

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)

苏南大叔:python语言,set和list有什么区别?set和list如何相互转化? - join测试
python语言,set和list有什么区别?set和list如何相互转化?(图11-11)

整体来说,这个join测试就是大跌眼镜啊...

参考文献

综述

本文从各大方面比较了常见的setlist的用法,本文是以python为例的,在其它语言里面,是否有一些变化,情况未知,待议。不过,本文对于其它高级编程语言,也应该具有一定的参考意义。

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。