美文网首页PythonPython语言与信息数据获取和机器学习
自学Python——有序的集合 List和tuple

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

作者: 新手村的0级玩家 | 来源:发表于2018-01-24 20:14 被阅读3次

    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)
    
    

    相关文章

      网友评论

        本文标题:自学Python——有序的集合 List和tuple

        本文链接:https://www.haomeiwen.com/subject/jbqpaxtx.html