list tuple dict set

 

List(列表)

列表可以进行截取、组合。

列表的数据项不需要具有相同的类型。

1、操作列表

创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可。如下所示:

list1 = ['physics', 'chemistry', 1997, 2000]
list2 = [1, 2, 3, 4, 5 ]
list3 = ["a", "b", "c", "d"]

(1)增

① 使用 append() 方法

list = [1,"alex"]          ## 空列表
list.append('Google')   ## 使用 append() 添加元素
list.append('Runoob')
print(list)

以上实例输出结果:
[1,"alex",'Google', 'Runoob']

② 使用 insert() 方法

li = ['alex',[1,2,3],'wusir','egon','女神','taibai']
li.insert(4,'chunge')    #在下标位4的位置插入
print(li)

以上实例输出结果:
['alex', [1, 2, 3], 'wusir', 'egon', 'chunge', '女神', 'taibai']

③ 使用 extend() 方法:在最后位置,分解插入

错误示例:
li = ['alex',[1,2,3],'wusir','egon','女神','taibai'] li.extend(123) print(li) 输出结果: li.extend(123) #int不可迭代 TypeError: 'int' object is not iterable
正确示例:
li = ['alex',[1,2,3],'wusir','egon','女神','taibai']
li.extend('dage') 
print(li)

输出结果:
['alex', [1, 2, 3], 'wusir', 'egon', '女神', 'taibai', 'd', 'a', 'g', 'e']

(2)删

① pop():按索引删除【默认删除最后一个】,有返回值:返回删除的值。

li = ['alex',[1,2,3],'wusir','egon','女神','taibai']
print
("原始列表:",li) print("pop掉的数据:",li.pop(1)) print("pop后的列表:",li) 运行结果: 原始列表: ['alex', [1, 2, 3], 'wusir', 'egon', '女神', 'taibai'] pop掉的数据: [1, 2, 3] pop后的列表: ['alex', 'wusir', 'egon', '女神', 'taibai']

② remove():按元素删除,无返回值


li = ['alex',[1,2,3],'wusir','egon','女神','taibai']
print("原始列表:",li)
li.remove('taibai')  
print("remove后的列表:",li)

运行结果: 
原始列表: [
'alex', [1, 2, 3], 'wusir', 'egon', '女神', 'taibai']
remove后的列表: [
'alex', [1, 2, 3], 'wusir', 'egon', '女神']

③ clear():清空

li = ['alex',[1,2,3],'wusir','egon','女神','taibai']
print("原始列表:",li)
li.clear()  
print("clear后的列表:",li)

运行结果:
原始列表: ['alex', [1, 2, 3], 'wusir', 'egon', '女神', 'taibai']
clear后的列表: []

④ del:删除列表

li = ['alex',[1,2,3],'wusir','egon','女神','taibai']
print("原始列表:",li)
del li   
print("del后的列表:",li)

运行结果:
原始列表: ['alex', [1, 2, 3], 'wusir', 'egon', '女神', 'taibai']
NameError: name 'li' is not defined
# 切片删除

li = ['alex',[1,2,3],'wusir','egon','女神','taibai']
print("原始列表:",li)
del li[2:] 
print("del切片删除后的列表:",li)

运行结果:
原始列表: ['alex', [1, 2, 3], 'wusir', 'egon', '女神', 'taibai']
del切片删除后的列表: ['alex', [1, 2, 3]]

(3)改:

li = ['alex',[1,2,3],'wusir','egon','女神','taibai']
print("原始列表:",li)
li[0:3] = [1,2,34,'春哥']
print("修改后的:",li)

运行结果:
原始列表: ['alex', [1, 2, 3], 'wusir', 'egon', '女神', 'taibai']
修改后的: [1, 2, 34, '春哥', 'egon', '女神', 'taibai']

(4)查

# 切片查找
list1 = ['physics', 'chemistry', 1997, 2000]
list2 = [1, 2, 3, 4, 5, 6, 7]

print("list1[0]: ", list1[0])
print("list2[1:5]: ", list2[1:5])   #顾头不顾尾

运行结果:
list1[0]:  physics
list2[1:5]:  [2, 3, 4, 5]
# 遍历
li = ['alex',[1,2,3],'wusir','egon','女神','taibai']
for i in li:
    print(i,end=' -- ')

运行结果:
alex -- [1, 2, 3] -- wusir -- egon -- 女神 -- taibai -- 

2、列表排序

li = [1,5,4,8,0,2,3]
print("原始列表:",li)
#正序排序【最快】
li.sort()
print("正序排序: ",li)

# 倒序排序
li.sort(reverse = True)
print("倒序排序: ",li)

# 反转
li.reverse()
print("对列表进行反转",li)

运行结果:
原始列表: [1, 5, 4, 8, 0, 2, 3]
正序排序:  [0, 1, 2, 3, 4, 5, 8]
倒序排序:  [8, 5, 4, 3, 2, 1, 0]
对列表进行反转 [0, 1, 2, 3, 4, 5, 8]

3、列表嵌套

def each_list(list_name):
    for yuansu in list_name:
        if isinstance(yuansu,list):
            each_list(yuansu)        # 嵌套
        else:
            print(yuansu)

li = [1,2,3,5,'alex',[2,3,4,'taibai'],'afds']
each_list(li)

运行结果:
1
2
3
5
alex
2
3
4
taibai
afds

4、列表函数 & 方法

Python包含以下函数:

li = ['taibai','武藤兰','sunxiansen','女神',['alex',2,3]]
print("原始列表:",li)
print("取第二个元素的第二个字符:",li[1][1])
print()

name = li[0].capitalize()   #只是找到,然后做了一些操作,就是“看戏”
print("使第一个元素的首字母大写:",name)
print("做了capitalize操作后li并没有发生改变:",li)
li[0] = name               # 真正修改了列表的值,开始“唱戏”
print("做了capitalize操作后,发生改变的li:",li)
print()

li[2] = li[2].replace('sen','')      # replace(old, new)
print("做了replace操作后,发生改变的li:",li)

运行结果:
原始列表: ['taibai', '武藤兰', 'sunxiansen', '女神', ['alex', 2, 3]]
取第二个元素的第二个字符: 藤

使第一个元素的首字母大写: Taibai
做了capitalize操作后li并没有发生改变: ['taibai', '武藤兰', 'sunxiansen', '女神', ['alex', 2, 3]]
做了capitalize操作后,发生改变的li: ['Taibai', '武藤兰', 'sunxiansen', '女神', ['alex', 2, 3]]

做了replace操作后,发生改变的li: ['Taibai', '武藤兰', 'sunxian生', '女神', ['alex', 2, 3]]

====================================================================================================================================================================

 

Tuple(元组)

另一种有序列表叫元组:tuple。tuple和list非常类似,但是tuple一旦初始化就不能修改。

不可变的tuple有什么意义?因为tuple不可变,所以代码更安全。如果可能,能用tuple代替list就尽量用tuple。

# 只读列表:可循环查询,可切片,可连接
# 儿子不能改,孙子可能可以改

1、tuple的陷阱

(1)当定义一个tuple时,在定义的时候,tuple的元素就必须被确定下来:

>>> t = (1, 2)
>>> t
(1, 2)

(2)如果要定义一个空的tuple,可以写成:

>>> t = ()
>>> t
()

(3)如果要定义一个只有1个元素的tuple,必须这样写:

# 错误示例
>>> t = (1)
>>> t
1
#定义的不是tuple,是1这个数!这是因为括号()既可以表示tuple,又可以表示数学公式中的小括号,这就产生了歧义,因此,Python规定,这种情况下,按小括号进行计算,计算结果自然是1。
# 正确示例
# 只有1个元素的tuple定义时必须加一个逗号,,来消除歧义:
>>> t = (1,)
>>> t
(1,)

2、“可变的” tuple

# 儿子不能改,孙子可能可以改

>>> t = ('a', 'b', ['A', 'B'])
>>> t[2][0] = 'X'
>>> t[2][1] = 'Y'
>>> t
('a', 'b', ['X', 'Y'])

  当我们把list的元素'A''B'修改为'X''Y'后,tuple变为:

 

  表面上看,tuple的元素确实变了,但其实变的不是tuple的元素,而是list的元素。tuple一开始指向的list并没有改成别的list,所以,tuple所谓的“不变”是说,tuple的每个元素,指向永远不变。即指向'a',就不能改成指向'b',指向一个list,就不能改成指向其他对象,但指向的这个list本身是可变的!

3、访问tuple

tup1 = ('physics', 'chemistry', 1997, 2000)
tup2 = (1, 2, 3, 4, 5, 6, 7 )
 
print("tup1[0]: ", tup1[0])
print("tup2[1:5]: ", tup2[1:5])

运行结果:
tup1[0]:  physics
tup2[1:5]:  (2, 3, 4, 5)

4、连接(“修改”)tuple

tup1 = (12, 34.56)
tup2 = ('abc', 'xyz')
 
# 以下修改元组元素操作是非法的。
# tup1[0] = 100
 
# 创建一个新的元组
tup3 = tup1 + tup2
print(tup3)

运行结果:
(12, 34.56, 'abc', 'xyz')

5、删除 tuple

元组中的元素值是不允许删除的,但可以使用del语句来删除整个元组,如下实例:

tup = ('physics', 'chemistry', 1997, 2000)
 
print(tup)
del tup
print("After deleting tup : ")
print(tup)

运行结果:(输出变量会有异常信息)
('physics', 'chemistry', 1997, 2000)
After deleting tup :
Traceback (most recent call last):
  File "test.py", line 9, in <module>
    print tup
NameError: name 'tup' is not defined

6、tuple 运算符

7、tuple 内置函数

8、range() 函数

for i in range(3,10,2):
    print(i)
print('+++++++')
for j in range(10,0,-2):
    print(j)
print('='*8)
for k in range(0,10,-1):   #不会报错,没有运行结果
    print(k)

运行结果:
3
5
7
9
+++++++
10
8
6
4
2
========

====================================================================================================================================================================

 

Dict(字典)

字典是另一种可变容器模型,且可存储任意类型对象,是无序的。

字典的每个键值 key=>value 对用冒号 : 分割,每个键值对之间用逗号 , 分割,整个字典包括在花括号 {}

# 和list比较,dict有以下几个特点:
# 查找和插入的速度极快,不会随着key的增加而变慢(二分查找);
# 需要占用大量的内存,内存浪费多。

# list相反:
# 查找和插入的时间随着元素的增加而增加;
# 占用空间小,浪费内存很少。

#所以,dict是用空间来换取时间的一种方法。

 

# 需要知道:
# 不可变数据类型(可哈希):元组,bool,int,str ——  key
# 可变数据类型(不可哈希):list,dict   ——  value

1、访问字典里的值

dic = {
    'name':['大梦','xiaomeng'],
    'py9':[{'人数':71,'age':18}],
    (1,2,3):'ergge'
}
print(dic["name"])
print(dic[(1,2,3)])

运行结果:
['大梦', 'xiaomeng']
ergge
dic1 = {'age':18,'name':'xiaohong','sex':''}
print(dic1)
print(dic1.keys(),type(dic1.keys()))
print(dic1.values(),type(dic1.values()))
print(dic1.items())          # 里边是元组,元组里边是“键,值”

运行结果:
{'age': 18, 'name': 'xiaohong', 'sex': ''}
dict_keys(['age', 'name', 'sex']) <class 'dict_keys'>
dict_values([18, 'xiaohong', '']) <class 'dict_values'>
dict_items([('age', 18), ('name', 'xiaohong'), ('sex', '')])

如果用字典里没有的键访问数据,会输出错误如下:

dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
 
print "dict['Alice']: ", dict['Alice']

运行结果:
dict['Alice']: 
Traceback (most recent call last):
  File "test.py", line 5, in <module>
    print "dict['Alice']: ", dict['Alice']
KeyError: 'Alice'
# 要避免key不存在的错误,有两种办法

# 一是通过in判断key是否存在:
>>> 'Thomas' in dic
False

# 二是通过dict提供的get()方法,如果key不存在,可以返回None,或者自己指定的value【首选】:
# 注意:返回None的时候Python的交互环境不显示结果。
>>> dic.get('Thomas')
>>> dic.get('Thomas', -1)
-1

2、修改字典里的值

向字典添加新内容的方法是:增加新的键/值对,修改或删除已有键/值对

dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
dict['Age'] = 8 # 更新
dict['School'] = "RUNOOB" # 添加
 
print("dict['Age']: ", dict['Age'])
print("dict['School']: ", dict['School'])

运行结果:
dict['Age']:  8
dict['School']:  RUNOOB

3、删除字典元素

要删除一个key,用pop(key)方法,对应的value也会从dict中删除

# pop(key)方法

dic1 = {'age':18,'name':'xiaohong','sex':''} dic1.pop('sex') print(dic1.pop('sex','无此键')) #可设置返回值 print(dic1) 运行结果: 无此键 {'age': 18, 'name': 'xiaohong'}
# popitem()方法:随机删除

dic1 = {'age':18,'name':'xiaohong','sex':''}
dic1.popitem()   # 有返回值,元组里面删除的是键值
print(dic1)

运行结果:
{'age': 18, 'name': 'xiaohong'}
# del 方法

del dic1['name']
print(dic1)
print()
del dic1
print(dic1)

运行结果:
{'age': 18, 'sex': ''}

Traceback (most recent call last):
  File "F:/Python/Project/All_Stacks/01 基础/day5/dict.py", line 42, in <module>
    print(dic1)
NameError: name 'dic1' is not defined
# clear() 方法

dic1.clear()
print(dic1)

运行结果:
{}

===========================================================================================================================================

 

Set(集合)

set和dict类似,也是一组key的集合,但不存储value,{ }。

由于key不能重复,所以,在set中,没有重复的key,且没有顺序。

>>> s = set([1, 1, 2, 2, 3, 3])
>>> s
{1, 2, 3}

1、set基础操作

(1)增

set1 = {'alex','wusir','ritan','egon'}
set1.add('alex')    #不重复
set1.add('nvshen')  #无序
print(set1)

运行结果:
{'alex', 'egon', 'ritan', 'wusir', 'nvshen'}

(2)删

# pop()

set1 = {'alex','wusir','ritan','egon'}
print("pop前的集合:",set1)
set1.pop()                        #随机删除,返回删除的元素
print("pop后的集合:",set1)

运行结果:
pop前的集合: {'alex', 'egon', 'wusir', 'ritan'}
pop后的集合: {'egon', 'wusir', 'ritan'}
# remove()

print("remove前的集合:",set1)
set1.remove('alex')        #按元素删除,要删除的元素没有的话 报错
print("remove后的集合:",set1)

运行结果:
remove前的集合: {'wusir', 'alex', 'ritan', 'egon'}
remove后的集合: {'wusir', 'ritan', 'egon'}
# del

del set1
print(set1)

运行结果:
NameError: name 'set1' is not defined

(3)改

# 集合的"改"不存在,原因如下:①无序的 ②虽然集合是可变类型,但是集合中的元素(key)是不可变类型

(4)查

set1 = {'alex','wusir','ritan','egon'}
for i in set1:
    print(i)

运行结果:
wusir
ritan
alex
egon

2、做数学意义上的交集、并集等操作# set1 = {1,2,3}

# set2 = {1,2,3,4,5}
#--------------------(1)交集
# print(set1 & set2)
# print(set1.intersection(set2))

#--------------------(2)并集
# print(set1 | set2)
# print(set1.union(set2))

#--------------------(3)差集  【set1 - set2:set1独有的】
# print(set1 - set2)
# print(set1.difference(set2))

#--------------------(4)反交集
# print(set1 ^ set2)
# print(set1.symmetric_difference(set2))

#--------------------(5)子集与超集
# print(set1 < set2)
# print(set1.issubset(set2))   #这两个相同,说明set1是set2的子集

# print(set2 > set1)
# print(set2.issuperset(set1))  #这两个相同,说明set1是set2的超集

#--------------------(6)frozenset:变成不可变的数据类型
s1 = {1,2,3}
print(s1,type(s1))
s = frozenset('barry') #只能”查“,不能”增 删 改“
print(s,type(s))
for i in s:
print(i)

运行结果:

{1, 2, 3} <class 'set'>
frozenset({'r', 'b', 'a', 'y'}) <class 'frozenset'>
r
b
a
y

3、功能:去重

li = [1,2,3,5,6,33,5,6,2,1,33,4]
set1 = set(li)
print(set1)

运行结果:
{1, 2, 3, 33, 5, 6, 4}

 

补充:

1、slice()函数

  • start -- 起始位置
  • stop -- 结束位置
  • step -- 间距

slice() 函数实现切片对象,主要用在切片操作函数里的参数传递。

>>>myslice = slice(5)    # 设置截取5个元素的切片
>>> myslice
slice(None, 5, None)
>>> arr = range(10)
>>> arr
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> arr[myslice]         # 截取 5 个元素
[0, 1, 2, 3, 4]

2、[ ] () {} set() 转换成bool值全是Null

 

posted @ 2019-04-09 10:13  timetellu  阅读(201)  评论(0编辑  收藏  举报