Python数据结构学习

注:本片文章是个人学习总结,内容来自《简明Python教程》

List 有序列表

List是一种保存有序项的数据结构。

项目列表应该使用方括号扩起来,以便 Python 能够理解您正在定义一个列表。一旦创建了列表,你就可以在列表中增加,删除或者搜索列表中的项 。 正因为我们可以增加和删除项,所以我们称列表是一种 可变 数据类型,也就是说这个类型可以被改变。

shoplist = ['apple','mango','carrot','banana']

<!--获取长度-->
len(shoplist)  //4

<!--遍历list-->
for item in shoplist:
    print(item)

<!--添加元素-->
shoplist.append('rice')

<!--list排序-->
shoplist.sort()

<!--赋值-->
shoplist[0] = 'Google'

<!--删除元素-->
del shoplist[1]

元组tuple

元组用于将多个对象组合在一起。可以将它们近似看作列表,但是没有列表类提供的许多功能。元组的一个重要特征是,它们和字符串一样是 不可变的 ,即你不能修改元组。

元组是由一些特殊的项定义的,这些项在一对可选的圆括号中,由逗号隔开。

元组通常用于这种情况,也就是语句或者用户自定义的函数可以安全地认为值的集合(即,值的元组)不会改变的情况。

<!--元组一旦定义后就不能在进行增删修改-->

zoo = ('Python','Java','JavaScript','php')

==注意:包含0或1个项的元组==

一个空的元组是由一堆空的圆括号组成的,例如,myempty = ().

但是对于一个项的元组且必须仅在第一个项的后面用一个括号来指定该元组,比如

myempty = (1,),因为因为如果没有逗号会造成歧义: a = (1)

>>> a = 2
>>> b = (a,11,22)
>>> b
(2, 11, 22)
>>> a = 3
>>> b
(2, 11, 22)

>>> c = [1,1]
>>> d = (c,22,33)
>>> d
([1, 1], 22, 33)
>>> c[1] = 4
>>> d
([1, 4], 22, 33)

元组中可以包含变量,变量可以改变,但元组的值不会变,元组中变量的值在里第一次创建就确定了,无法通过变量去改变。

但是如果你的元组中的变量是一个列表list,那么元组中的值会随着列表list改变而改变

字典

字典是一种键值对集合,键必须是唯一的,而且键只能用不可变对象,比如字符串,但键值没有多大限制。

d = {key1:value1,key2:value2}

字典的常用方法有del删除键值对,添加键值对直接用索引操作符访问一个键并为其赋值,遍历字典则用items方法。

ab = {
    'Swaroop': 'swaroop@swaroopch.com',
    'Larry': 'larry@wall.org',
    'Matsumoto': 'matz@ruby-lang.org',
    'Spammer': 'spammer@hotmail.com'
}
<!--添加键值对-->
ad['addKey'] = 'value'

<!--删除键值对-->
del ab['Larry']

<!--遍历字典-->

for key,value in ad.items():
    print('Contact {} at {}'.format(key,value)

序列

列表list、元组tuple和dict都是序列的一种。

序列的主要特征是:成员测试(例如:in 与 not in 表达式)和索引操作,这两种操作让我们可以直接从序列中提取特定的部分。

序列还有一种特殊的操作叫做切片,切片可以让我们得到序列的一部分。

shoplist = ['apple','mango','carrot','banana']
name = 'swaroop'

# 字符串索引 #
print('Item 0 is', shoplist[0])
print('Item 1 is', shoplist[1])
print('Item 2 is', shoplist[2])
print('Item 3 is', shoplist[3])
print('Item -1 is', shoplist[-1])
print('Item -2 is', shoplist[-2])
print('Character 0 is', name[0])

# 列表切片 #
print('Item 1 to 3 is', shoplist[1:3])
print('Item 2 to end is', shoplist[2:])
print('Item 1 to -1 is', shoplist[1:-1])
print('Item start to end is', shoplist[:])

# 字符串切片 #
print('characters 1 to 3 is', name[1:3])
print('characters 2 to end is', name[2:])
print('characters 1 to -1 is', name[1:-1])
print('characters start to end is', name[:])

引用

当你创建了一个对象,并把它赋值给一个变量时,这个变量只是 引用 了这个对象,变量并不能代表对象自身!因此,你可以把变量名当作一个指针,它指向储存对象的那一块计算机内存。这称作绑定名称到对象。

print('Simple Assignment')
shoplist = ['apple', 'mango', 'carrot', 'banana']
# mylist 只是指向同一个对象的另一个别名!
mylist = shoplist

# 我买下了第一件商品,所以把它从列表中移除
del shoplist[0]

print('shoplist is', shoplist)
print('mylist is', mylist)
# 注意到 shoplist 和 mylist 产生了同样的输出
# 输出的都是没有 'apple' 的相同列表
# 这验证了它们都指向着同一个对象

print('Copy by making a full slice')
# 通过全切片来获得一个副本
mylist = shoplist[:]
# 移除第一个元素
del mylist[0]

print('shoplist is', shoplist)
print('mylist is', mylist)
# 注意到现在这两个列表有差异了

输出:

$ python ds_reference.py
Simple Assignment
shoplist is ['mango', 'carrot', 'banana']
mylist is ['mango', 'carrot', 'banana']
Copy by making a full slice
shoplist is ['mango', 'carrot', 'banana']
mylist is ['carrot', 'banana']

记住:如果你想要获得列表、或者类似的序列、或更复杂对象的副本,只要不是像整数一样简单的 对象,你都需要通过切片操作来获得它的副本。如果你直接把一个变量名赋值给另一个,它们两个都会引用同一个对象。在赋值时你需要注意这一点,不然可能会造成意想不到的结果,从而带来麻烦。

    原文作者:Cube
    原文地址: https://segmentfault.com/a/1190000016460726
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞