欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-09 22:04:12
...

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)