自学Python——有序的集合 List和tuple

1.List基础

1.1定义

classmates = ['Michael', 'Bob', 'Tracy']
print('Max:'+max(classmates))

1.2整体和单个输出

print(classmates)
print(classmates[0])

1.3判断某个元素是否存在

print("Bob" in classmates)

1.4获取最后一个元素

print("最后一个元素为"+ classmates[-1])

1.5获取倒数第二个元素

print("倒数第二个元素为"+ classmates[-2])

1.6赋值

可以赋不同类型的值

classmates[0]="0"
classmates[1]=1
classmates[2]="2"

1.7取长度

print("集合长度为: %d " % len(classmates))

1.8循环遍历

for i in range(0, 2 + 1):
    print(classmates[i])

for temp in classmates:
    print(temp)

1.9末尾添加和指定位置添加

classmates.append("3")
classmates.insert(0,12)
print(classmates)

1.10移除指定元素

classmates.remove('0')
print(classmates)

1.11移除末尾和移除指定位置的元素

classmates.pop()
classmates.pop(0)
print(classmates)

1.12多维集合

p=['asp', 'php']
s = ['python', 'java',p , 'scheme' ]
print(s)
print(s[2][1])

2.tuple

2.1tuple和list非常类似,但是tuple一旦初始化就不能修改

mates = ('Michael', 'Bob', 'Tracy')
print(mates)

2.2

获取元素和遍历的方法与List相同,但是不能 添加 修改 删除 其中的元素

mates[0])=0   #E0001:invalid syntax  tuple
print(mates[0])

2.3 只有1个元素的tuple定义时必须加一个逗号,,来消除歧义:

t = (1,)
print(t)

2.4“可变的”tuple:

t = (1,[2],3)
t[1].append(3)
t[1].insert(0,20) 
print(t)

tuple不变,指的是,tuple的每个元素,指向永远不变,当元素存储的是基本数据类型时,就直接指向该数值,而第二个元素 指向的是 List的首地址,tuple始终指向该List未发生改变

2.5遍历

for temp in t:
    print(temp) 

3.切片

3.1 List切片

有序集合List取指定索引范围的操作,Python提供了切片(Slice)操作符

L =[1,2,3,4,5,6,7,8,9,9,55,5,22]
print(L[0:3])
# 从索引0开始取,直到索引3为止,但不包括索引3。即索引0,1,2,正好是3个元素。
L1=L[2:6]
print(L1)
print(L[6:])# 第二个索引缺失表示到最后
print(L[:3])# 第一个索引缺失表示到最前
print(L[-2:])# -2 表示倒数第二个

L=list(range(100))

# 前十个
print(L[:10])
# 后十个
print(L[-10:])
# 11-20
print(L[10:20])
# 前十个,每两个取一个
print(L[:10:2])
# 所有数,每5个取一个:
print(L[::5])

3.2 tuple切片

tuple也是一种list,唯一区别是tuple不可变。 因此,tuple也可以用切片操作,只是操作的结果仍是tuple:

T=(1,2,3,4,5,6,7,8,9)
print(T)
print(T[:3])

3.3 字符串切片

字符串'xxx'也可以看成是一种list,每个元素就是一个字符。因此,字符串也可以用切片操作,只是操作结果仍是字符串:

S="0123456789"
print(S[:3])

4. 迭代

L=[1,2,3,4,5,6,7,8,9]
T =(1,2,3,4,5,6,7,8,9)
S=set(L)
d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
d['TOM']=100 
d['Bob']=200 
s='123456789'

# 迭代,统一采用相同的个数

# list
print('-------------')
for temp in L:
    print(temp)

# tuple
print('-------------')
for temp in T:
    print(temp)


# dict
print('-------------')
for temp in d:
    print(temp)

print('-------------')
for temp in d.keys():
    print(temp)

print('-------------')
for temp in d.values():
    print(temp)

print('-------------')
for tempK,tempV in d.items():
    print(tempK)
    print(tempV)

# set
print('-------------')
for temp in S:
    print(temp)

# str
print('-------------')
for temp in s:
    print(temp)

所以,当我们使用for循环时,只要作用于一个可迭代对象,for循环就可以正常运行,而我们不太关心该对象究竟是list还是其他数据类型。那么,如何判断一个对象是可迭代对象呢?
方法是通过collections模块的Iterable类型判断:

1.引包,2.判断

from collections import Iterable
f=isinstance('abc', Iterable) # str是否可迭代
print(f)

最后一个小问题,如果要对list实现类似Java那样的下标循环怎么办?
Python内置的enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身:

for i, value in enumerate(['A', 'B', 'C']):
    print(i, value)

上面的for循环里,同时引用了两个变量,在Python里是很常见的,比如下面的代码:

for x, y in [(1, 1), (2, 4), (3, 9)]:
    print(x, y)

列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。
要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]可以用
print(list(range(1, 11)))
但如果要生成[1x1, 2x2, 3x3, ..., 10x10]怎么做

方法一、循环生成

L=[]
for i in range(1,11):
    L.append(i*i)
print(L)

方法二、用列表生成式

L2=[i*i for i in range(1,11)]
print(L2)

同样可以在for后面加上if

L3=[i*i for i in range(1,11)if i%2==0]
print(L3)

变着花样的来

L4=[i+j for i in 'abc' for j in 'xyz']
L5=[i+j for i in 'abc' if i>'b'  for j in 'xyz' if j>'y']
print(L4)
print(L5)

运用列表生成式,可以写出非常简洁的代码。例如,列出当前目录下的所有文件和目录名,可以通过一行代码实现:

import os  # 导入os模块,模块的概念后面讲到
L6=[d for d in os.listdir('.')] # os.listdir可以列出文件和目录
print(L6)

把一个list中所有的字符串变成小写:

L7= ['Hello', 'World', 'IBM', 'Apple']
L8=[s1.lower() for s1 in L7]
print(L8)

练习

如果list中既包含字符串,又包含整数,由于非字符串类型没有lower()方法,所以列表生成式会报错:
使用内建的isinstance函数可以判断一个变量是不是字符串
L9 = ['Hello', 'World', 18, 'Apple', None]请修改列表生成式,通过添加if语句保证列表生成式能正确地执行:
期待输出: ['hello', 'world', 'apple']

L10=[s1.lower() for s1 in L9 if isinstance(s1 ,str)]
print(L10)

5. 生成器

在循环的过程中不断推算出后续的元素呢?
在Python中,这种一边循环一边计算的机制,称为生成器:generator。

5.1例子介绍

L = [x * x for x in range(10)]
print(L)
g = (x * x for x in range(10))

L是一个list,而g是一个generator。注意与 tuple区分

print(g)
print(next(g))
print(next(g))
print(next(g))
print(next(g))

for n in g:
    print(n)

因为g是一个generator,因此,会在之前生成的基础上进行生成,不会每次从最初值开始

5.2另一种方式创建 generator

定义一个斐波那契数列函数

def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        print(b)
        a, b = b, a + b
        n = n + 1
    return 'done'

a, b = b, a + b 相当于:
t = (b, a + b) # t是一个tuple
a = t[0]
b = t[1]

5.3定义一个斐波那契数列生成器


def fib1(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1
    return 'done'


f= fib1(5)
for i in f:
    print(i)

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

推荐阅读更多精彩内容

  • http://python.jobbole.com/85231/ 关于专业技能写完项目接着写写一名3年工作经验的J...
    燕京博士阅读 7,543评论 1 118
  • 0. 序言 python 是一门脚本语言:封装性强,语法简洁,开发效率高,只用函数open就可以打开一个txt文件...
    付凯强阅读 1,211评论 0 5
  • 一、python 变量和数据类型 1.整数 Python可以处理任意大小的整数,当然包括负整数,在Python程序...
    绩重KF阅读 1,619评论 0 1
  • 最近在慕课网学习廖雪峰老师的Python进阶课程,做笔记总结一下重点。 基本变量及其类型 变量 在Python中,...
    victorsungo阅读 1,654评论 0 5
  • 我感觉自己就像是一条咸鱼 放了很多盐 虽然不臭,但是很难下口 咸鱼确实也能炒饭 但是像我这样的估计也只能放一丝丝提...
    天天掉渣阅读 212评论 0 0