python_列表和元组

1.1.列表定义

列表是python中内置有序可变序列,列表的所有元素放在一对中括号“[]”中,并使用逗号分隔开;
一个列表中的数据类型可以各不相同,可以同时分别为整数、实数、字符串等基本类型,甚至是列表、字典以及其他自定义类型的对象。
例如:

[1, 2, 3, 2.4, 5]
[0.01, "zhangsan", [1,2,3]]

创建

  • 使用“=”直接将一个列表赋值给变量即可创建列表对象。例如:a_list = [], b_list = [1, 2, 3]
  • 使用list()函数将元组、range对象、字符串或其他类型的可迭代对象类型的数据转换为列表。
    例如:a_list = list("Hello")将字符串"hello"转换成列表['H', 'e', 'l', 'l', 'o']
    删除 当不再使用时,使用del命令删除整个列表 例如:
>>>x = [1, 2, 3]
>>>del x[1]            #删除指定位置元素
>>>x
[1, 3]
>>>del x               #删除整个列表
>>>x
Traceback (most recent call last):
   File "<pyshell#6>", line 1, in <module>
             x
NameError: name 'x' is not defined

1.2.列表元素的增加

1.2.1.append()

向列表尾部追加一个元素,不改变其内存首地址,属于原地操作。例如:

x = [1, 2, 3]
x.append(4)
print(x)

输出:

[1, 2, 3, 4]

1.2.2.insert()

向列表任意位置插入一个元素,不改变其内存首地址,属于原地操作。
例如:

x = [1,3,4]
x.insert(1,2)
print(x)

输出:

[1, 2, 3, 4]

1.2.3.extend()

将另一个迭代对象的所有元素添加至该列表对象尾部,不改变其内存地址,属于原地操作。
例如:

x = [1,2]
x.extend([3,4])
print(x)

输出:

[1, 2, 3, 4]

1.3.运算符"+"和"*"

并不是真的为列表添加元素,而是创建一个新列表,不属于原地操作,而是返回新列表。

x = [1,2,3]
y = x + [4]
print(y)
y = x*2
print(y)

输出:

[1, 2, 3, 4]
[1, 2, 3, 1, 2, 3]

此时x保持不变,依旧是[1,2,3]

1.4.列表元素的删除

1.4.1.pop()

使用列表的pop()方法删除并返回指定(默认为最后一个)位置上的元素,如果给定的索引超出了列表的范围,则抛出异常。

x = [1,2,3,4]
print(x.pop())
print(x.pop(1))

输出:

4
2

1.4.2.remove()

删除首次出现的指定元素,如果列表中不错在要删除的元素,则抛出异常。
例如:

x = [1,2,3,4]
x.remove(2)
print(x)

输出:

[1, 3, 4]

1.4.3.del

删除列表中的指定位置上的元素。
例如:

x = [1,2,3,4]
del x[1]
print(x)

输出:

[1, 3, 4]

1.5.列表元素访问与计数

1.5.1.count()

统计指定元素在列表对象中出现的次数。
例如:

x = [1,2,3,3,4,5]
print(x.count(3))
print(x.count(0))

输出:

2
0

1.5.2.index()

获取指定元素首次出现的下标,若列表对象中不存在指定元素,则抛出异常。
例如:

x = [1,2,3,2,2,4]
print(x.index(2))

输出:

1

1.5.3.in

测试列表中是否存在某元素
例如:

x = [1,2,3,4]
print(3 in x)
print(5 in x)

输出:

True
False

1.6.列表排序

1.6.1.sort()

按照指定规则对所有元素进行排序,默认规则是直接比较规则大小。
例如:

aList = [3,4,5,6,7,9,11,13,15,17]
import random
random.shuffle(aList)                         #随机降序
print(aList)
aList.sort()                                  #默认是升序排序
aList.sort(reverse = True)                    #降序排序
print(aList)

输出:

[15, 4, 13, 11, 5, 17, 9, 3, 7, 6]
[17, 15, 13, 11, 9, 7, 6, 5, 4, 3]

1.6.2.reverse()

将列表中所有元素原地逆序排列。
例如:

x = [6,4,2,4,1]
print(sorted(x))
print(sorted(x,reverse = True))
print(x)

输出:

[1, 2, 4, 4, 6]
[6, 4, 4, 2, 1]
[6, 4, 2, 4, 1]

1.6.4.reversed()

返回一个逆序排列后的迭代对象,不对原列表做任何修改。
例如:

x = [1,5,3,6,2]
print(list(reversed(x)))
print(x)

输出:

[2, 6, 3, 5, 1]
[1, 5, 3, 6, 2]

1.7.用语序列操作的常用内置函数

1.7.1.len()

返回列表中的元素个数,同样适用于元组、字典、集合、字符串等。

1.7.2.max()、min()

返回列表中的最大或最小元素,同样适用于元组、集合、range对象等。

1.7.3.sum()

对列表的元素进行求和运算。

1.7.4.zip()

返回可迭代的zip对象。
例如:

aList = [1, 2, 3]
bList = [4, 5, 6]
cList = zip(aList, bList)
print(cList)
print(list(cList))

输出:

<zip object at 0x0000020CBC537D08>
[(1, 4), (2, 5), (3, 6)]

1.7.5.enumerate()

枚举列表元素,返回枚举对象,其中每个元素为包含下标和值的元组。该函数对元组、字符串同样有效。
例如:

for item in enumerate('abcdef'):
    print(item)

输出:

(0, 'a')
(1, 'b')
(2, 'c')
(3, 'd')
(4, 'e')
(5, 'f')

1.8.遍历列表的三种方式

a = ['a','b','c','d','e','f']
for i in a:
    print(i)
for i in range(len(a)):
    print(i,a[i])
for i,ele in enumerate(a):
    print(i,ele)

输出:

a
b
c
d
e
f
0 a
1 b
2 c
3 d
4 e
5 f
0 a
1 b
2 c
3 d
4 e
5 f

1.9.列表推导式

列表推导式使用非常简洁的方式来快速生成满足特定需求的列表,代码具有非常强的可读性。
语法形式:[表达式 for 变量 in 序列或迭代对象]
列表推导式在逻辑上相当于一个循环,知识形式更加简洁。

lis = [i for i in range(100)]
print(lis)

使用列表推导式实现嵌套列表的平铺

ves = [[1,2,3],[4,5,6],[7,8,9]]
print([num for elem in ves for num in elem])

输出:

[1, 2, 3, 4, 5, 6, 7, 8, 9]

过滤不符合条件的元素,从列表中选择符合条件的元素组成新的列表

aList = [-1,-4,6,7.5,-2.3,9,-11]
print([i for i in aList if i>0])
[6, 7.5, 9]

在列表推导式中使用多个循环,实现多序列元素的任意组合,并且可以结合条件语句过滤特定元素

print([(x,y) for x in range(3) for y in range(3)])
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
print([(x,y) for x in [1,2,3] for y in [3,1,4] if x != y])
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

列表练习
写一个循环,不断地问用户想买什么,用户选择一个商品编号,就把相应的商品添加到购物车里,最终用户输入q退出时,打印购物车里的商品列表

products = [['iphone',6888],['三星',30000],['小米',2500]]
shopping_car = []
flag = True
while flag:
    print("******商品列表******")
    for index,i in enumerate(products):
        print("%s, %s| %s" %(index,i[0],i[1]))
    choice = input("请输出您想购买的商品的编号:")
    if choice.isdigit():#isdigit()判断变量是什么类型
        choice = int(choice)
        if choice >= 0 and choice < len(products):
            shopping_car.append(products[choice])
            print("已经将%s加入购物车" % (products[choice]))
        else:
            print("该商品不存在")
    elif choice == "q":
        if len(shopping_car)>0:
            print("您打算购买以下商品:")
            for index,i in enumerate(shopping_car):
                print("%s. %s| %s" %(index,i[0],i[1]))
        else:
            print("您的购物车中没有添加商品")
        flag = False

输出:

******商品列表******
0, iphone| 6888
1, 三星| 30000
2, 小米| 2500
请输出您想购买的商品的编号:0
已经将['iphone', 6888]加入购物车
******商品列表******
0, iphone| 6888
1, 三星| 30000
2, 小米| 2500
请输出您想购买的商品的编号:1
已经将['三星', 30000]加入购物车
******商品列表******
0, iphone| 6888
1, 三星| 30000
2, 小米| 2500
请输出您想购买的商品的编号:2
已经将['小米', 2500]加入购物车
******商品列表******
0, iphone| 6888
1, 三星| 30000
2, 小米| 2500
请输出您想购买的商品的编号:q
您打算购买以下商品:
0. iphone| 6888
1. 三星| 30000
2. 小米| 2500

1.10.列表切片

使用索引获取列表的元素(随机读取)
列表元素支持用索引访问,正向所以从0开始

colors = ["red","blue","green"]
print(colors[0])
print(colors[1])
print(colors[2])
print(colors[-1])
red
blue
green
green

1.10.1.列表的切片操作

切片操作不是列表特有的,python中的有序序列都支持切片,如字符串,元组。
切片的返回结果类型和切片对象类型一致,返回的是切片对象的子序列,如:对一个列表切片返回一个列表,字符串切片返回字符串。
格式:li[start:end:step]
start是切片起点索引,end是切片终点索引,但切片结果不包括终点索引的值。step是步长默认是1。

li=["A","B","C","D"]
t=li[0:3]  #起点的0索引可以省略
print(t)
t=li[2:]   #省略end,则切到末尾
print(t)
t=li[1:3]
print(t)
t=li[0:4:2] #从li[0]到li[3],设定步长为2.
print(t)

如何确定start和end,是什么关系?在step的符号一定的情况下,start和end可以混合使用正向和反向索引,无论怎样,你都要保证start和end之间有和step反向一致元素间隔,否则会切出空列表。

t=li[0:2]
t=li[0,-2]
t=li[-4,-2]
t=li[-4,2]

上面的结果都是一样的:t为["A","B"]


t=li[-1:-3:-1]
t=li[-1:1:-1]
t=li[3:1:-1]
t=li[3:-3:-1]

上面的结果都是一样的:t为["D","C"]

t=li[-1:-3]
t=li[-1:1]
t=li[3:1]
t=li[3:-3]

都切出空列表



同时,step的正负决定了切片结果的元素采集的先后
省略start和end表示以原列表全部为目标

t=li[::-1]   t--->["C","B","A"]        #反向切,切出全部
t=li[:]       t--->["A","B","C","D"]  #正向切全部

1.10.2.使用切片来原地修改列表内容

aList = [3,5,7]
aList[len(aList):] = [9]  #在尾部追加元素
print(aList)
aList[:3] = [1,2,3]       #替换前3个元素
print(aList)
aList[:3] = []            #删除前3个元素
print(aList)
[3, 5, 7, 9]
[1, 2, 3, 9]
[9]

1.10.3.使用del与切片结合来删除列表元素

aList = [3,5,7,9,11]
del aList[:3]     #删除前3个元素
print(aList)
bList = [3,5,7,9,11]
del bList[::2]    #删除偶数位置上的元素
print(bList)
[9, 11]
[5, 9]

1.10.4.切片返回的是列表元素的浅复制

所谓浅复制,是指生成一个新的列表,并且把原列表中所有元素的引用都复制到新列表中。
例如:

aList = [3,5,7]
bList = aList     #bList与aList指向同一个内容
print(bList)
bList[1] = 8      #修改其中一个对象会影响另一个
print(aList)
print(aList == bList)    #判断两个列表的元素是否完全一致
print(aList is bList)    #判断两个列表是同一个对象
print(id(aList))         #内存地址
aList = [3,5,7]
bList = aList[::]        #切片,浅复制
print(aList == bList)    #两个列表的元素完全一致
print(aList is bList)    #两个列表不是同一个对象
print(id(aList) == id(bList)) #内存地址不一致
bList[1] = 8
print(bList)
print(aList)
[3, 5, 7]
[3, 8, 7]
True
True
2340905449608
True
False
False
[3, 8, 7]
[3, 5, 7]

1.11.元组

元组属于不可变序列,一旦常见,用任何方法都不可以修改其元素。从形式上,元组的所有元素放在一对圆括号中,元素之间用逗号分隔。

1.11.1.元组的创建与删除

创建 使用“=”将一个元组赋值给变量
例如:

x = (1,2,3)   #直接把元组赋值给一个变量
print(x)

创建只有一个元素的元组

x = (3)
print(type(x))
x = (3,)
print(type(x))
<class 'int'>
<class 'tuple'>

创建空元组的方法

x = ()
print(x)
x = tuple()
print(x)
()
()

使用tuple函数将其他序列转换为元组

print(tuple(range(5)))
print(tuple('abcdefg'))    #把字符串转换为元组
aList = [-1,-4,6,7.5,-2.3,9,-11]
print(tuple(aList))        #把列表转换为元组
(0, 1, 2, 3, 4)
('a', 'b', 'c', 'd', 'e', 'f', 'g')
(-1, -4, 6, 7.5, -2.3, 9, -11)

删除 使用del可以删除元组对象,不能删除元组中的元素

1.11.2.元组与列表的区别

  • 元组中的数据一旦定义就不允许更改。
  • 元组没有append()、expend()和insert()等方法,无法向元组中添加元素
  • 元组没有remove()或pop()方法,也无法对元组元素进行del操作,不能从元组中删除元素。
  • 从效果上看,tuple()冻结列表,而list()融化元组。

1.12.元组的优点

  • 元组的速度比列表更快
  • 元组对不需要改变的数据进行“写保护”将使得代码更加安全。
  • 元组可用作字典键(特别是包含字符串、数值和其他元组这样的不可变数据的元组)。元组有时还作为函数的返回值返回(返回多个值)。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,928评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,192评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,468评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,186评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,295评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,374评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,403评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,186评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,610评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,906评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,075评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,755评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,393评论 3 320
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,079评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,313评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,934评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,963评论 2 351

推荐阅读更多精彩内容