Python入门——基本数据结构

Python里面的数据结构,基本的有下面几种,列表,集合,元组,对于不同的数据结构当然有不同的表现形式,操作方法了,先来看看各种数据结构的表示方式

#列表
[1,2,3,4,5,6]
#元组
(1,2,3,4,5,6)
#集合
{1,2,3,4,5,6}
#字典
{'name': 'tom', 'age': 11}

列表

列表的特点是,它是一个可变的集合,不仅仅是结构可变,里面还可以放类型不一样的对象,比如

num = [1,2,3,4,"23",True]
for x in num:
    print(type(x))
#输出结果为
<class 'int'>
<class 'int'>
<class 'int'>
<class 'int'>
<class 'str'>
<class 'bool'>

可以看到同一个集合中可以加入各种类型的数据,不会有类型检测。所以我们在使用的时候在代码的编写上也要注意了。

对列表的常规操作有
获取元素
如果只是单纯地访问元素,我们可以使用切片或者下标num[0...n],不过列表有一个

num = [1,2,3,4,"23",True]
print(num[3])
#输出结果为3
print(num[3:5])
#输出结果为[4, '23']

添加元素

num = [1,2,3,4,"23",True]
#方法1,append方法插入,常用,只能添加一个元素
num.append(3)
#方法2,获取切换的最后一个位置,在这里就是num[6:6]的意思
num[len(num):] = [3]
print(num)
#输出结果为[1, 2, 3, 4, '23', True, 3]

添加一个集合

#添加一个集合,extend扩展的意思
num = [1,2,3,4,"23",True]
1、方法1,extend方法插入,添加一个集合
num.extend([8,5])
2、方法2,切片方法,同上
num[len(num):] = [8,5]
print(num)
#输出结果为[1, 2, 3, 4, '23', True, 3,8,5]

插入元素到指定位置

num = [1,2,3,4,"23",True]
#方法1,insert插入让3成为集合里面下标为1的元素,其他元素往后挪
num.insert(1,3)
#方法2,使用切片
num[1:1] = [3]
print(num)
#输出结果为[1, 3, 2, 3, 4, '23', True]

移除元素
删除列表中值为 x 的第一个元素。如果没有这样的元素,就会返回一个错误。

num = [1,2,3,3,4,"23",True]
num.remove(3)
print(num)
#输出结果为[1, 3, 2, 3, 4, '23', True],只会移除最先匹配到的元素

#如果移除的元素不存在,会抛出下列错误ValueError: list.remove(x): x not in list

还有一些其它的函数

#列表采用的链式结构,pop默认把序列尾部的元素remove并返回,pop(x)代表的是pop指定下标的元素
pop()
pop(x) 
#对列表中的元素就地进行排序
sort() 
#对列表的元素进行倒排
reverse()
#返回一个列表的副本,可以通过切片[:]来实现
copy()
#计算列表中某个元素x的个数
count(x)
#获取列表中第一个匹配到的元素x的下标,如果没有匹配到的话返回一个错误ValueError: x is not in list
index(x)
#清空列表的元素,和del num[:]的效果是一样的
clear()

字符串也是列表,所以我们适用于字符串的操作,基本上都适合列表,比如下面的用法

num = [1,2,3]
print(num * 3)
#输出结果为[1, 2, 3, 1, 2, 3, 1, 2, 3]

所以列表的操作也变得和字符串一样简单了,但是我们最好还是规范一下代码,这样利用代码的阅读。

元组

元组(tuple)也是一个非常常用的数据结构,区别于列表,元组的一个最大的特性就是不可变。一个元组由数个逗号分隔的值组成,比如:

t = 1,2,3,4,5,'sad',True
print(t)
#输出结果为(1, 2, 3, 4, 5, 'sad', True)

虽然我们定义元组的时候可以不加括号,但是加上括号可以更加适合代码的阅读。
元组可以进行嵌套,类似于广义表一样

a = (1,2,3)
b = (4,5,6)
print((a,b))#必须添加一个括号,否则,print函数会把`,`号转换成空格

不可变
元组是不可变的,这种不可变体现在元素的引用上,比如

num = [1,2,3]
a = (1,2,3,num)
# 对元组元素进行修改会抛出异常TypeError: 'tuple' object does not support item assignment
a[0] = 3
print(a)

num = [1,2,3]
a = (1,2,3,num)
print(a)
#输出结果为(1, 2, 3, [1, 2, 3])
num[0] = 3
print(a)
#输出结果为(1, 2, 3, [3, 2, 3])

可以看到元组虽然是可不变的,但是对于元组里面的list列表是可变的,我们对list进行操作并不会报错。这是因为我们虽然修改了列表,但是元组里面的列表对象指向的内存地址依然是不变的。
当我们想要构建空的元组或者构建只有一个元素的元组

#定义空元组
a= ()
#定义只有一个元素的元组,一定要加上,号,否则无法区分是元组还是单个的对象
b = (1,)
print(a)
print(b)
#输出结果为
()
(1,)

python的语法非常的神秘莫测,不同于其他编程语言,能够直接取出线性序列中的元素

a= (1,2,3)
t1,t2,t3 = a
print(a)
print(t1,t2,t3)
#输出结果为
(1, 2, 3)
1 2 3

集合

另一种比较常见的数据结构是集合(set),和java一样,集合是一个无序不重复元素的集,基本功能包括关系测试和去重(是否包含子集,交集,并集等)
通常我们用大括号或者set()函数来创建集合,使用set()来创建空集合

num = {1,2,3,4,5,6,6}
print(num)
#输出结果为{1, 2, 3, 4, 5, 6}

#检测是否包含元素
print(1 in num)
#输出结果为True

num = {1,2,3,4,5,6,6}
num2 = {0,1,2,3,7,8,9}

#差集,集合A中有,集合B中没有的元素
num3 = num - num2
print(num3)
#输出结果为{4, 5, 6}

#交集,两个集合都包含的元素
num3 = num & num2
print(num3)
#输出结果为{1, 2, 3}

#并集,融合两个集合,去除重复的部分
num3 = num | num2
print(num3)
#输出结果为{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

#异或,存在于集合A或者集合B,但不同时存在于两个集合中
num3 = num - num2
print(num3)
#输出结果为{0, 4, 5, 6, 7, 8, 9}

有一种集合推导式语法:

num= [x for x in list(range(20)) if x % 2 != 0]
print(num)
#输出结果为{1, 3, 5, 7, 9, 11, 13, 15, 17, 19}
num= {x for x in "ababababababbae" if x not in "abc"}
print(num)
#输出结果为{'e'}

字典

字典相当于java中的map,字典以key作为索引,关键字key可以是任意不可变类型,如果会比的话,就无法求得相同的索引了,通常用字符串或数值。如果元组中只是包含字符串或者数字的话,元组也是可以作为关键字使用的,但是如果元组中包含像列表这样的可变对象,那么就不能够作为关键字了。

字典是一个无序的键值对组合,使用{}来创建空的字典。基本上在java中对map的操作都适用于python里面的字典,比如对key相同的键值对进行写入的话,会覆盖原来的value,不过要是访问不存在的key,在java里面会返回null,而且python中会返回None,但是python中还可以设置默认的值

person= {'name': 'tom', 'age': 11}
grade = person.get('grade')
print(grade)
#输出结果为None

person= {'name': 'tom', 'age': 11}
grade = person.get('grade','grade first')
print(grade)
#输出结果为grade first

对一个字典执行 list(d.keys())将返回一个字典中所有关键字组成的无序列表(如果你想要排序,只需使用 sorted(d.keys())使用 in 关键字可以检查字典中是否存在某个关键字(指字典),使用del可以删除key关键字,或者删除整个字典,删除之后如果再访问字典,就会抛出NameError: name 'person' is not defined对象未定义的异常
构造字典可以使用{},也可以使用dict()构造函数

person = dict([('name','tom'), ('age',11)])
print(person)
#输出结果为{'name': 'tom', 'age': 11}

person = dict(name='tom',age=11)
print(person)
#输出结果为{'name': 'tom', 'age': 11}

也可以使用字典推导式创建字典

num = {x:x**2 for x in range(5)}
print(num)
#输出结果为{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容