Python容器:列表、元组、字典、集合

序言

  • 此文章针对有一定基础的人,简明扼要的介绍字符串、列表、元组、字典、集合的概念和常用操作,以备复习巩固之用。

  • 底层的基本数据类型:布尔型,整形,浮点型以及字符串类型。

  • 基本数据类型组合起来称之为数据结构。

    • 数据结构:列表、元组、字典、集合。

序列

  • 序列:一系列元素以它们所处的位置为索引,以第一个到最后一个依次编号就组成一个序列。
  • 序列结构:字符串、元组和列表都是序列结构,但是它们又有各自的特点。
    • 元组和列表与字符串不同的是,元组和列表并不是求所含元素的种类相同,每个元素都可以是任何Python类型的对象。
    • 元组和列表不同的是,元组是不可变的,元组被赋值后,这些值就会被固定在元组中,不会被修改,而列表中的值还可以进行插入、删除等操作。

字符串(string)

  • 字符串是我们首先要接触到的Python序列类型,其本质为字符序列,Python字符串不可改变,无法对原字符串进行修改,但是可以将字符串的一部分复制到新的字符串中。

创建字符串

  • 1.1 单引号
    • 双引号
    • 三个单引号:创建多行字符串
'example1'
"example2"
'''example3,
example4
continue'''
  • 1.2 使用str()转换
str(123)
'123'
#注意用print输出的差别,没有引号
print(str(123))
123

字符串的简单操作

  • \转义
    • \n
    • \t
    • "
  • +拼接
#注意,one后面有个空格
使用 + 进行拼接
'one '+'two'
'one two'
直接写在后面也可以拼接
'one ''two'
'one two'
  • *复制

  • []中括号提取

#注意,偏移量不能超过字符串长度
vocabulary = 'transcendental'
vocabulary[0]
't'
vocabulary[-1]
'l'
  • [start : end : step]字符串分片
#:引号不可省略,其他的都可以省略
#[:] 提取全部
#[:end] 开始到end - 1
#[start:end:step]定步长截取
#负号的使用可以带来许多有意思的操作,比如步长为-1,那么将会反向输出字符串
#在这里允许偏移量超过字符串长度
vocabulary = 'transcendental'

相关操作函数

  • len()获取字符串函数
  • split()分割
  • join()合并
  • replace()替换字符串
  • startswith()判断字符串开始字符是否为某个字符串
  • find()查询某个字符的开始的偏移量
  • rfind()查询某个字符的最后的偏移量
  • count()统计某个字符出现的次数
  • title()所有单词开头字母变大写
  • upper()所有字母大写
  • lower()所有字母小写
  • swapcase()大小写转换
  • split()分割
#split基于分隔符分割字符串,分割成为列表
#逗号为分隔符,分割program_ex 
program_ex = 'hello,world'
program_ex.split(',')
['hello','world']
  • join()合并
#与split逻辑相反
#调用顺序:首先指定粘合用的字符串,然后指定需要粘合的列表
#string.join(list)
crypto_list = "'Yeti', 'Bigfoot', 'Loch Ness Monster'"
ctypto_string = ','.join(crypto_list)
print('Found and signing book deals:',ctypto_string)
Found and signing book deals:Yeti, Bigfoot, Loch Ness Monster
  • replace()替换字符串
#参数 需要被替换的子串,用于替换的子串,需要替换次数
#将三个o替换成X
crypto_list = "'Yeti', 'Bigfoot', 'Loch Ness Monster'"
crypto_list_replace = crypto_list.replace('o','X',3)
print(crypto_list_replace)
['Yeti', 'BigfXXt', 'LXch Ness Monster']

列表(list)

创建列表

  • 1.1:中括号[ ]或者list( )创建列表
empty_list = []
weekly = ['Monday','Tuesday','Wednesday','Thursday','Friday']

another_empty_list = list()
  • 1.2:使用list()转换
#字符串转换
list('cat')
['c','a','a']

#元组转换
a_tuple = ('ready','fire','aim')
list(a_tuple)
['ready','fire','aim']
  • 1.3 split分割,参见字符串中的split()
  • 1.4(高级方式):列表推式(一种从一个或者多个迭代器快速简洁地创建数据结构的一种方法,将循环和条件判断结合,避免语法冗长)
  • 表达式:
    • [expression for item in iterable]
    • [expression for item in iterable if condition]
number_list = [number for number in range(1,6)]
number_list
[1,2,3,4,5]
a_list = [number for number in range(1,6) if number % 2 == 1]
a_list
[1,3,5]
  • 循环嵌套
    • 创建一个元组,其中元组第一项由循环1控制,第二项由循环2控制。
    • [(iterable1,iterable2) for item in iterable1 for item in iterable2]
    • example:
列表推导模式
rows = range(1,4)
cols = range(1,3)
cells = [(row,col) for row in rows for col in cols]
	for cell in cells:
		print(cell)
(1 1)
(1 2)
(2 1)
(2 2)
(3 1)
(3 2)

普通模式
rows = range(1,4)
cols = range(1,3)
	for row in rows:
		for col in cols:
			print(row,col)
1 1
1 2
2 1
2 2
3 1
3 2

列表的简单操作

  • 获取列表元素
    • 通过偏移量(offse)获取对应位置的元素
    • 表达式:list_number[offset]
#正偏移量
weekly = ['Monday','Tuesday','Wednesday','Thursday','Friday']
weekly[0]
'Monday'
weekly[1]
'Tuesday'
#负偏移量,从尾数开始计数
weekly[-1]
'Friday'
  • 列表的嵌套:列表中可以包含各类元素,也可包含其它列表。
#列表3中的元素类型包含整形,字符串,数组
list1 = ['Wednesday','Friday']
list2 = [3,'apple',4,'TV']
list3 = [list1,'helloworld',list2,8,5]
#访问列表3中第一元素
list3[0]
['Wednesday','Friday']
#通过列表3访问列表2中第一个元素
list3[2][1]
3
  • 修改列表元素
    • 通过偏移量(offset)修改列表元素
#使用偏移量无法更改字符串中的指定字符,因为字符串本身不可变。
weekly = ['Monday','Tuesday','Wednesday','Thursday','Friday']
weekly[1] = 'correct'
['Monday','Tuesday','correct','Thursday','Friday']
  • 指定范围的列表切片
#获取子序列
weekly = ['Monday','Tuesday','Wednesday','Thursday','Friday']
weekly[0:2]
['Monday','Tuesday']
#设置步长:每两个元素提取一个
weekly[::2]
['Monday','Wednesday','Friday']
#列表逆序,同样使用负号可以产生很有意思的事情
weekly[::-1]
['Friday','Thursday','Tuesday','Wednesday','Monday']

列表函数

  • append()

  • extend()

  • insert()

  • del()

  • remove()

  • pop()

  • index()

  • in()

  • =赋值

  • copy()

  • append():列表后追加元素

# 插入Saturday
weekly = ['Monday','Tuesday','Wednesday','Thursday','Friday']
weekly.append('Saturday')
weekly = ['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday']
  • extend()或者+=:列表合并,将一个列表加入到另一个中,成为一个列表。
# 合并列表
weekly = ['Monday','Tuesday','Wednesday','Thursday','Friday']
weekend =['Saturday','Sunday']
weekly.extend(weekend)
weekly = ['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']

weekly += weekend
weelkly
weekly = ['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']

  • insert()
# 插入Saturday
weekly = ['Monday','Tuesday','Wednesday','Thursday','Friday']
weekly.insert(5,'Saturday')
weekly = ['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday']
  • del()
# 删除Friday,del为Python语句,而不是list方法,所以不能用  .  调用
weekly = ['Monday','Tuesday','Wednesday','Thursday','Friday']
del weekly[4]
weekly
['Monday','Tuesday','Wednesday','Thursday']
  • remove()
# 删除Friday,remove是list方法
weekly = ['Monday','Tuesday','Wednesday','Thursday','Friday']
weekly.remove('Friday')
weekly
['Monday','Tuesday','Wednesday','Thursday']
  • pop()
# 获取元素后删除,且pop()的,默认只为-1,删除尾元素,因此pop(0)=pop(-1),可以用pop(0)获取并删除首元素
weekly = ['Monday','Tuesday','Wednesday','Thursday','Friday']
weekly.pop()
'Friday'
weekly
['Monday','Tuesday','Wednesday','Thursday']
  • index():插入特定值的元素位置
#返回指定值的位置信息
weekly = ['Monday','Tuesday','Wednesday','Thursday','Friday']
weekly.index('Monday')
0
  • in():判断存在
# 判断Sunday是否在weekly中
weekly = ['Monday','Tuesday','Wednesday','Thursday','Friday']
'Sunday' in weekly
False
  • count():统计特定值的出现次数
weekly.count('Wednesday')
  • join()
    • 字符串方法的扩充,参见字符串方法中的join
  • sort()和sorted()
# sort对原列表进行排序,sorted对原列表生成副本后排序,原列表内容不变
marxes = ['Groucho','Chico','Harpo']
sorted_marxes = sorted(marxes)
sorted_marxes
['Chico','Groucho','Harpo']

marxes = ['Groucho','Chico','Harpo']
marxes.sort()
marxes
['Chico','Groucho','Harpo']
  • len()
weekly = ['Monday','Tuesday','Wednesday','Thursday','Friday']
a = len(weekly)
print(a)
5
  • in()
# 赋值后weekly = Weekly,改变其中一个,另一个随之改变
weekly = ['Monday','Tuesday','Wednesday','Thursday','Friday']
Weekly = weekly
  • copy()
# copy()
# list()
#列表分片
#用以上方法产生的新列表和元列表没有内在联系,即改变其中任何一个,其它的不受影响
a = [1,2,3]
b = copy(a)
c= list(a)
d = a[:]

a[0] = '100000000000'
b = [1,2,3]
c = [1,2,3]
d = [1,2,3]

元组(tuple)

  • 元组与序列类似,也是由任意元素组成的序列,但是元组一旦创建如同字符串,不可改变。

元组的创建

  • 使用()创建空元组
#创建空元组
empty_tuple = ()
()
  • 使用逗号’,'创建元组
#创建一个元素的元组,最后','不可省略
one_marx = 'martrix',
( 'martrix',)

#创建多个元素的元组,最后的','可省略
another_martx =  'martrix','array'
 ('martrix','array')
  • 元组解包(元组赋值操作)
another_martx =  'martrix','array'
a,b = another_martx
a 
'martrix'
b
'array'
元组解包的经典操作,交换变量的值
one = 'martrix'
two =  'array'
two,one = one,two
one
'array'
two
'martrix'
  • tuple创建
weekly = ['Monday','Tuesday','Wednesday','Thursday','Friday']
tuple(weekly)
('Monday','Tuesday','Wednesday','Thursday','Friday')
  • 元组的不可更改由其独特的优点,在以后的应用中可以用到,但是一般情况下多用列表和字典。

字典(dict)

  • 字典中的元素顺序无关紧要,通过不同的键(key)进行访问,字典是可以改变的,和现实的字典类似。
  • 字典在其它的语言中被称为关系型数组,哈希表,哈希图等。

字典的创建

  • 使用大括号{key:value}创建
#空字典
empty_dic = {}
#键值对的字典
one_dict = {"day1":study
"day2":paly
"day3":sleep
}
empty_dic
{"day1":study
"day2":paly
"day3":sleep
}
  • 使用dict()创建
#将包含双值的子序列的序列转换成字典,第一值为键,第二个值为值
one_list = [[1,'a'],[2,'b']]
dict(one_list)
{1:'a',2:'b'}
#可以将双值的,双字符,元组,列表化成字典。
tos = ('ab','cd','ef')
dict(tos)
{'c':'d','a':'b','e':'f'}

字典的相关操作

  • [key]储存,访问,添加或者修改元素
#储存一个元素
d = {
    'one':123,
    'two':2,
    'three':3,
    'test':2
   }
 d2 = d['three']
 d2
 ['three':3]
#访问一个元素,如果不存在会报错
d = {
    'one':123,
    'two':2,
    'three':3,
    'test':2
   }
   d['one']
   123
#添加一个元素,然后修改这个元素
d = {
    'one':123,
    'two':2,
    'three':3,
    'test':2
   }
#添加元素'try':55
d['try'] = '55'
d
d = {
    'one':123,
    'two':2,
    'three':3,
    'test':2
    'try':55
   }
修改元素555
d['try'] = '5'

字典的函数

  • update()合并字典
  • del()删除具有指定键的元素
  • clear()删除所有元素,变成空字典
  • in()判断是否存在
  • get()获取键对应元素,[key]不同是,不会报错
  • keys()获取所有键
  • values()获取所有值
  • item()获取所有键值对
  • =赋值
  • copy()复制
    用法参见list

集合(set)

  • 集合和只剩下的键的字典类似,键与键之间不允许重复,类似数学中的集合,主要包括并、交等运算,且集合是无序的。

集合的创建

  • 用{}大括号将一系列用逗号隔开的值包裹起来。
  • 用set函数创建
  • 将其他类型转换成集合
#空集合
empty_set = set()
empty_set
set()
#偶数集合
even_numbers = {0,2,4,6,8}
even_numbers
{0,2,4,6,8}
#转换字符串,不包含重复的键
set('letters')
{‘l’,‘e’,‘t’,'r','s'#转换列表
set(['Dasher','Dancer','Prancer','Mason-Dixon'])
{'Dasher','Dancer','Prancer','Mason-Dixon'}
#转换元祖
set(('Monday','Tuesday','Wednesday','Thursday','Friday'))
{'Monday','Tuesday','Wednesday','Thursday','Friday'}
#转换字典,注意只保留键
set({'apple':'red','flower':'blue','tree':'green'})
{'apple','flower','tree'}

集合的相关函数

  • 用in测试值是否存在
for name,contents in drinks.items():
	if 'vodka' in contents:
		print(name)

screwdriver
martini
black russin
white russin
#选择vodka,但是不要vermouth,且不是cream
for name,contents in drinks.items():
if 'vodka' in contents and not ('vermouth' in contents or 'cream' in contents):
	print(name)
screwdriver
black russin
  • intersection() 或者& 获取交集
drinks ='martini' : {'vodka','vermouth'}
	'black russin' : {'vodka','kahlua'}
	'white russin' : {'cream','kahlua','vodka'}
	'manhattan' : {'rye','vermouth','bitters'}
	'screwdriver' : {'orange juice','vodka'}for name,contents in drinks.items():
	if contents & {'vermouth','orange jucice'}
		print(name)
screwdriver
martini
manhattan

for name,contents in drinks.items():
	if 'vodka' in contents and not contents & {'vermouth','cream'}:
		print(name)
screwdriver
black russin

a和b的交集
a.intersection(b)

#bruss和wruss的交集
bruss = drinks['black russian']
wruss = drinks['white russian']
bruss & wruss
{'kahlua','vodka'}
  • union() 或者 | 函数获取并集
  • different() 或者 - 获得集合的并集
  • symmetric_difference() 或者 ^ 获得异或集(只在两个集合中出现一次)
  • issubset() 或者 <= 判断一个集合是否是另一个集合的子集
  • < 判断真子集
  • issupset() 或者 >= 判断超集(超集的概念与子集相反)
  • 判断真超集

总结

  • 使用方括号[]创建列表,使用逗号创建元祖,使用花括号{}创建字典,且都是通过方括号对单个元素进行访问。
marx_list = ['Groucho','Chico','Harpo']
marx_tuple = 'Groucho','Chico','Harpo'
marx_dict = {'Groucho' : 'banjo','Chico' : 'pinao','Harpo' : 'harp'}
marx_list[2]
'Chico'
marx_tuple[2]
'Chico'
marx_dict['banjo']
'Chico'

猜你喜欢

转载自blog.csdn.net/qq_37808565/article/details/84892692