• Python之列表


    列表:有序的可变的元素集合,列表是最常见的Python数据类型,它可以作为一个方括号内的逗号分隔出现。

    列表的数据项不需要具有相同的类型。

    创建一个列表,只要把逗号分隔的不同数据项使用方括号括起来即可,如下所示:

    list1 = ['Google', 'baidu', 1997, 2000]
    list2 = [1, 2, 3, 4, 5]
    list3 = ["a", "b", "c", "d"]

    与字符串的索引一样,列表索引从0开始,列表可以进行截取、组合等
    列表的定义方式2:
    # 1)列表生成式
    # range(stop) [0, 1, 2...,stop-1]
    # range(start, stop[,step]) [start, start + step, start + 2*step..., < stop]
    # step默认值是1

    nums = range(100)
    # 为了防止生成的列表没有被使用,python3做了一些改变,不会立即生成列表
    # 生成1~100之间的所有奇数
    nums = range(1, 100, 2)

    # 2)列表推导式 从一个list推导出另外一个list
    1 # 原始方式::
    2 nums = [1, 2, 3, 4, 5]
    3 resultList = []
    4 
    5 for num in nums:
    6     resultNum = num**2
    7     resultList.append(resultNum)
    8 
    9 print("resultList:: ", resultList)
    输出结果:resultList::  [1, 4, 9, 16, 25]
    # 列表推导式::
    # 语法:: [表达式 for 变量 in 列表]
    # [表达式 for 变量 in 列表 if条件]
    
    
    1 # for循环里面得出的num值取幂次方
    2 resultList = [num**2 for num in nums]
    3 print(resultList)
    4 
    5 resultList = [num**2 for num in nums if num % 2 != 0]
    6 print(resultList)
    
    

    输出结果:

    [1, 4, 9, 16, 25]
    [1, 9, 25]

    列表增加的常用操作

    1:append()

    # append() 方法用于在列表末尾添加新的对象。

    # append() 方法用于在列表末尾添加新的对象。
    # list.append(obj)

    # 参数::
    # obj -- 添加到列表末尾的对象。

    # 返回值::
    # 该方法无返回值,但是会修改原来的列表。
    1 list1 = ["Google", "Jd", "TaoBao"]
    2 list1.append("baidu")
    3 print("更新后的列表:: ", list1)

    输出结果:更新后的列表::  ['Google', 'Jd', 'TaoBao', 'baidu']

    1 AList = []
    2 num = [2]
    3 AList.append(num)
    4 print("id(num) == id(AList[0]):: ", id(num) == id(AList[0]))
    5 print("num的值没有发生变化的时候:: ", id(num), id(AList[0]), AList)

    输出结果:

    id(num) == id(AList[0]):: True
    num的值没有发生变化的时候:: 37290792 37290792 [[2]]

    # 如上例所示,当 num 发生变化时(前提是 id(num) 不发生变化),
    # Alist 的内容随之会发生变化。往往会带来意想不到的后果,想避免这种情况,可以采用深拷贝解决:
    1 num.append(5)
    2 print("当num的值发生变化的时候::", id(num), id(AList[0]), AList)

    输出结果为:

    当num的值发生变化的时候:: 37290792 37290792 [[2, 5]]

    # 可见当num发生变化的时候,AList也发生了变化,这有可能不是我们想要的结果
    2:insert()
    # insert() 函数用于将指定对象插入列表的指定位置

    # insert()方法语法:
    # list.insert(index, obj)

    # 参数::
    # index -- 对象obj需要插入的索引位置。
    # obj -- 要插入列表中的对象。

    # 返回值::
    # 该方法没有返回值,但会在列表指定位置插入对象。
    
    
    1 List1 = ['Google', 'Runoob', 'Taobao']
    2 List1.insert(1, 'Baidu')
    3 print("insert插入后的列表结果:: ", List1)
    输出结果:
    insert插入后的列表结果::  ['Google', 'Baidu', 'Runoob', 'Taobao']

    3:extend()
    # extend() 函数用于在列表末尾一次性追加另一个序列中的多个值

    # extend()方法语法:
    # list.extend(seq)

    # 参数::
    # seq -- 元素列表。

    # 返回值::
    # 该方法没有返回值,但会在已存在的列表中添加新的列表内容。
    1 List1 = ['Google', 'Runoob', 'Taobao']
    2 List2 = range(5)
    3 List1.extend(List2)
    4 print("扩展后的列表:: ", List1)
    输出结果:
    扩展后的列表::  ['Google', 'Runoob', 'Taobao', 0, 1, 2, 3, 4]
    # extend与append的区别
    AList = ['w', 'i', 's', 't']
    AList.extend(['q', 'y'])
    print("AList扩展之后的结果:: ", AList)
    
    BList = ['w', 'i', 's', 't']
    BList.append(['q', 'y'])
    print("BList扩展之后的结果:: ", BList)

    输出结果:

    AList扩展之后的结果:: ['w', 'i', 's', 't', 'q', 'y']
    BList扩展之后的结果:: ['w', 'i', 's', 't', ['q', 'y']]

    # extend 与 append 方法的相似之处在于都是将新接收到参数放置到已有列表的后面。而 extend 方法只能接收 list,且把这个 list
    # 中的每个元素添加到原 list 中。
    # 而 append 方法可以接收任意数据类型的参数,并且简单地追加到 list 尾部。

    4:乘法运算
    1 # ['Hi!'] * 4 = ['Hi!', 'Hi!', 'Hi!', 'Hi!']  重复
    2 List1 = ['Hello']
    3 print("List1的乘法运算:: ", List1*4)

    输出结果:

    List1的乘法运算::  ['Hello', 'Hello', 'Hello', 'Hello']

    5:加法运算

    1 # 加法运算
    2 # [1, 2, 3] + [4, 5, 6] = [1, 2, 3, 4, 5, 6] 组合
    3 AList = ['a', 'b', 'c']
    4 BList = ['d', 'e', 'f', 'g']
    5 print("AList + BList:: ", AList + BList)
    输出结果:
    AList + BList::  ['a', 'b', 'c', 'd', 'e', 'f', 'g']

    列表的删除常用操作:

    1:del

    # del语句 可以删除一个指定的元素(对象)

    # 语法::
    # del 指定元素

    # 注意:
    # 可以删除整个列表
    # 删除一个变量
    # 也可以删除某个元素
     1 List1 = ['Google', 'Baidu', 1997, 2000]
     2 print("原始列表:: ", List1)
     3 
     4 del List1[1]
     5 print("删除第二个元素:: ", List1)
     6 # 可以这样直接删除一个变量
     7 num = 888
     8 del num
     9 # 删除整个列表
    10 del List1

    输出结果:

    原始列表:: ['Google', 'Baidu', 1997, 2000]
    删除第二个元素:: ['Google', 1997, 2000]

    2:pop()

    # pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值。

    # pop()方法语法:
    # list.pop([index=-1]])

    # 参数::
    # index -- 可选参数,要移除列表元素的索引值,不能超过列表总长度,默认为 index=-1,删除最后一个列表值。

    # 返回值::
    # 该方法返回从列表中移除的元素对象。
     1 List1 = ['Google', 'Baidu', 'Taobao']
     2 List1.pop()
     3 print("列表现在为:: ", List1)
     4 List1.pop(1)
     5 print("列表现在为:: ", List1)
     6 
     7 # 可以通过以下方法打印pop()函数来显示返回值
     8 List1 = ['Google', 'Baidu', 'Taobao']
     9 ListPop = List1.pop(1)
    10 print("删除的项为:: ", ListPop)
    11 print("列表现在为:: ", List1)

    输出结果:

    列表现在为:: ['Google', 'Baidu']
    列表现在为:: ['Google']
    删除的项为:: Baidu
    列表现在为:: ['Google', 'Taobao']

    3:remove()

    # remove() 函数用于移除列表中某个值的第一个匹配项。

    # remove()方法语法:
    # list.remove(obj)

    # 参数::
    # obj -- 列表中要移除的对象

    # 返回值::
    # 该方法没有返回值但是会移除两种中的某个值的第一个匹配项。
    
    
    1 List1 = ['Google', 'Baidu', 'Taobao']
    2 List1.remove('Baidu')
    3 print("现在的列表为:: ", List1)
    4 List1.remove('Google')
    5 print("列表现在为:: ", List1)
    输出结果:

    现在的列表为:: ['Google', 'Taobao']
    列表现在为:: ['Taobao']

    # 注意,如果要删除的元素列表里面不存在,程序会报错,所以在删除元素的时候,最好判定以下
    # 这个元素是否存在于这个列表里面

    # 另外注意循环内删除列表元素所带来的坑
    
    
    1 nums = [1, 2, 2, 3, 4, 2, 5, 2]
    2 # 删除列表里面所有为2的元素
    3 for num in nums:
    4     if num == 2:
    5         nums.remove(num)
    6 
    7 print("删除所有2的元素的列表为:: ", nums)
    输出结果:删除所有2的元素的列表为::  [1, 3, 4, 5, 2]
    此时我们发现我们并没有删除完所有为2的元素
    那么用什么方式避免这种问题呢?两种方式:
    1)
    1 while 2 in nums:
    2     nums.remove(2)
    3 
    4 print(nums)

    2)

    1 # 列表推导式
    2 nums = [i for i in nums if not(i == 2)]
    3 print(nums)

    更新修改列表中的值

    1):查询操作index()

    # index() 函数用于从列表中找出某个值第一个匹配项的索引位置。

    # index()方法语法:
    # list.index(obj)

    # 参数::
    # obj -- 查找的对象。

    # 返回值::
    # 该方法返回查找对象的索引位置,如果没有找到对象则抛出异常。
    
    
    1 List1 = ['Google', 'Baidu', 'Taobao']
    2 print("Baidu的索引值:: ", List1.index('Baidu'))
    3 print("Taobao的索引值:: ", List1.index('Taobao'))

    输出结果:

    Baidu的索引值:: 1
    Taobao的索引值:: 2

    2)count()

    # count() 方法用于统计某个元素在列表中出现的次数。

    # count()方法语法:
    # list.count(obj)

    # 参数::
    # obj -- 列表中统计的对象。

    # 返回值::
    # 返回元素在列表中出现的次数。
    
    
    1 AList = [123, 'Google', 'Taobao', 'Baidu', 123, 456]
    2 print("123元素的个数:: ", AList.count(123))
    3 print("456元素的个数:: ", AList.count(456))
    
    

    输出结果:

    123元素的个数:: 2
    456元素的个数:: 1

    3)获取多个元素

    items[start:end:step]
    1 AList = [123, 'Google', 'Taobao', 'Baidu', 123, 456]
    2 pic = AList[::]
    3 print("切片:: ", pic)
    4 
    5 pic = AList[1:4:2]
    6 print("pic:: ", pic)

    输出结果:

    切片:: [123, 'Google', 'Taobao', 'Baidu', 123, 456]
    pic:: ['Google', 'Baidu']

    列表的遍历操作

    1)方式1   根据元素进行遍历

    for item in list

    1 values = ["a", "b", "a", "c"]
    2 
    3 currentIndex = 0
    4 for v in values:
    5     print(v)
    6     print("列表元素对应的索引值::", values.index(v, currentIndex))
    7     currentIndex += 1

    输出结果:

    a
    列表元素对应的索引值:: 0
    b
    列表元素对应的索引值:: 1
    a
    列表元素对应的索引值:: 2
    c
    列表元素对应的索引值:: 3

    2)方式2    根据索引进行遍历

    for index in range(len(list)):
    
    
    1 values = ['google', 'baidu', 'sogou', 'baidu']
    2 
    3 for index in range(len(values)):
    4     print("index索引对应的值:: ", index, values[index])
    
    

    输出结果:

    index索引对应的值:: 0 google
    index索引对应的值:: 1 baidu
    index索引对应的值:: 2 sogou
    index索引对应的值:: 3 baidu

    3)方式3   创建对应的枚举对象,遍历枚举对象

    枚举对象概念:通过枚举函数,生成一个新的对象
    枚举对象作用:用于将一个可遍历的数据对象(如列表、元组或字符串)组合一个索引序列。同时列出数据下标和数据
    语法:enumerate(sequence, [start=0]) sequence:一个序列,迭代器或其他支持迭代对象
    start:下标起始位置
    values = ['a', 'b', 'c', 'd', 'e', 'f']
    # 1:先根据列表,创建一个枚举对象
    enumerate(values)
    # 想要打印出来结果可以这样写
    # print(list(enumerate(values)))
    (结果为:[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd'), (4, 'e'), (5, 'f')])
    # 遍历整个枚举对象
    # 你可以这样遍历
    # for tupValues in enumerate(values):
    # print(tupValues[0])
    # print(tupValues[1])
    
    
    1 nums = (0, 'baidu')
    2 idx, value = nums
    3 print(idx)
    4 print(value)
    
    

    输出结果为:

    0
    baidu

    # 所以我们也可以这样遍历枚举对象
    # for tupValues in enumerate(values):
    # idx, value = tupValues
    # print(idx)
    # print(value)
    1 for idx, value in enumerate(values):
    2     print(idx, "::", value)
    输出结果为:

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

    迭代器介绍

    # 什么是迭代
    # 是访问集合元素的一种方式 按照某种顺序逐个访问集合中的每一项

    # 什么是可迭代对象
    # 能够被迭代的对象,称之为可迭代对象 判定依据:能作用于for in
    # 判定方法:import collections
    # isinstance(obj, collections.Iterable)
    
    
    # 判定一个对象是不是可迭代对象
    
    
    1 import collections
    2 nums = [1, 2, 3]
    3 print(isinstance(nums, collections.Iterable))
    输出结果:True

    # 迭代器:是可以记录遍历位置的对象 从第一个元素开始,往后通过next()函数,进行遍历,只能往后,不能往前
    # 判定依据:能作用于next()函数
    # 判定方法:import collections
    # isinstance(obj, collections.Iterator)
    # 注意:迭代器也是可迭代对象,所以也可以作用于for in
    
    
    1 nums = [1, 2, 3]
    2 result = isinstance(nums, collections.Iterator)
    3 print("是否是个迭代器:: ", result)
    4 # 说明nums是个可迭代对象,单不是一个迭代器
    5 
    6 # 生成一个可迭代器
    7 iteratorNum = iter(nums)
    8 print(iteratorNum)
    输出结果:

    是否是个迭代器:: False
    <list_iterator object at 0x020D5390>

    # 为什么会产生迭代器
    # 1:使用迭代器不要求事先准备好整个迭代过程中的所有元素。迭代器仅仅在迭代到某个元素时才计算该元素,
    # 而在这之前或之后元素可以不存在或者被销毁。因此迭代器适合遍历一些数量巨大甚至无限的序列。

    # 2:提供了一个统一的访问集合的接口, 可以把所有的可迭代对象,转换成迭代器进行使用
     1 values = ['baidu', 'google', 'sogou']
     2 # 创建一个迭代器
     3 it = iter(values)
     4 
     5 # 遍历迭代器
     6 while True:
     7     try:
     8         x = next(it)
     9         print(x)
    10     except StopIteration:
    11         break
    12 
    13 # 注意:如果取出完毕,再继续取得话,则会报错 StopIteration

    输出结果:

    baidu
    google
    sogou

    # 迭代器一般不能多次迭代
     1 # 例如下面
     2 nums = [1, 2, 3, 4]
     3 it1 = iter(nums)
     4 
     5 for v in it1:
     6     print(v)
     7 
     8 print("---------------------")
     9 for v in it1:
    10     print(v)
    11 # 可以看出第二次访问迭代器的时候没有任何数据了

    输出结果:

    1
    2
    3
    4
    ---------------------

    列表的判定操作

    # 元素 in 列表
    # 元素 not in 列表
    1 values = [1, 2, 3, 4, 5]
    2 print(6 in values)
    3 print(6 not in values)
    输出结果:

    False
    True

    # cmp() 方法用于比较两个列表的元素。
    # cmp()方法语法:
    # cmp(list1, list2)

    # 参数:
    # list1 -- 比较的列表。
    # list2 -- 比较的列表。

    # 返回值:
    # 如果比较的元素是同类型的,则比较其值,返回结果。
    # 如果两个元素不是同一种类型,则检查它们是否是数字。
    # 如果是数字,执行必要的数字强制类型转换,然后比较。
    # 如果有一方的元素是数字,则另一方的元素"大"(数字是"最小的")
    # 否则,通过类型名字的字母顺序进行比较。
    # 如果有一个列表首先到达末尾,则另一个长一点的列表"大"。
    # 如果我们用尽了两个列表的元素而且所 有元素都是相等的,那么结果就是个平局,就是说返回一个 0
    # Python 3.X 的版本中已经没有 cmp 函数,如果你需要实现比较功能,需要引入 operator 模块,适合任何对象,

    # Python3.x 可以直接使用> < == 来比较两个列表的大小
     1 List1 = ['a', 'b', 'c']
     2 List2 = ['a', 'd']
     3 
     4 print cmp(List1, List2)
     5 
     6 list3, list4 = [456, 'xyz'], [123, 'abc']
     7 
     8 print cmp(list3, list4)
     9 
    10 
    11 list5 = [1, 2, 3]
    12 list6 = [1, 2, 3]
    13 
    14 print cmp(list5, list6)

    输出结果:

    -1
    1
    0

     1 List1 = [456, 'abc']
     2 List2 = [123, 'abd']
     3 
     4 result = List1 > List2
     5 print("List1 > List2:: ", result)
     6 
     7 List3 = [1, 2, 3]
     8 List4 = [1, 2, 3]
     9 result = List3 == List4
    10 print("List3 == List4:: ", result)

    输出结果:

    List1 > List2:: True
    List3 == List4:: True

    列表的排序操作

    
    
    # 方式1 内建函数 可以对所有可迭代对象进行排序
    # sorted() 函数对所有可迭代的对象进行排序操作。

    # sorted 语法:
    # sorted(iterable[, cmp[, key[, reverse]]])

    # 参数说明:
    # iterable -- 可迭代对象
    # cmp -- 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。
    # key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
    # reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
    
    
    1 a = [5, 7, 6, 3, 4, 1, 2]
    2 b = sorted(a)
    3 # 可以保留原列表
    4 print("a列表信息:: ", a)
    5 print("b列表信息:: ", b)
    
    

    输出结果:

    a列表信息:: [5, 7, 6, 3, 4, 1, 2]
    b列表信息:: [1, 2, 3, 4, 5, 6, 7]

    # sorted()的高级用法。
    # 有时候,我们要处理的数据内的元素不是一维的,而是二维的甚至是多维的,那要怎么进行排序呢?
    # 这时候sorted()的key参数就派上用场了,key参数可传入一个自定义函数。
    1 List = [('b', 1), ('a', 2), ('c', 4), ('d', 3), ('e', 5)]
    2 def getKey(x):
    3     return x[1]
    4 
    5 result = sorted(List, key=getKey, reverse=True)
    6 print(result)

    输出结果:

    [('e', 5), ('c', 4), ('d', 3), ('a', 2), ('b', 1)]

    # 方式2 列表对象方法
    # sorted()和sort()的主要区别在于,list.sort()是对已经存在的列表进行操作,进而可以改变进行操作的列表
    # 而内建函数sorted()返回的是一个新的list,而不是在原来的基础上进行操作的。
    # 另一点区别就是:sorted()对所有可迭代对象排序,而sort只能操作列表
    
    
     1 L = [1, 3, 2, 5, 7, 4]
     2 result = L.sort()
     3 print("原来的L信息::", L)
     4 print("result接收到的结果:: ", result)
     5 
     6 l = [('xq', 18), ('xq2', 16), ('xq1', 17), ('xq3', 15)]
     7 l.sort()
     8 print("l排序后的结果:: ", l)
     9 
    10 def getKey1(x):
    11     return x[1]
    12 
    13 l.sort(key=getKey1)
    14 print("根据key值排序的结果:: ", l)
    
    

    输出结果:

    原来的L信息:: [1, 2, 3, 4, 5, 7]
    result接收到的结果:: None
    l排序后的结果:: [('xq', 18), ('xq1', 17), ('xq2', 16), ('xq3', 15)]
    根据key值排序的结果:: [('xq3', 15), ('xq2', 16), ('xq1', 17), ('xq', 18)]

    列表的乱序和反转

    # 可以随机打印一个列表
    # 导入random模块
    # import random
    # random.shuffle(list)
    1 import random
    2 
    3 l = [1, 2, 3, 4, 5]
    4 res = random.shuffle(l)
    5 print(l, res)
    6 # 由此我们可以看到random.shuffle()是直接改变原有列表

    输出结果:

    [2, 5, 1, 3, 4] None

    # 列表反转
    # list.reverse()
    # 切片反转
    # l[::-1]
    
    
    1 l = [1, 2, 3, 4, 5]
    2 res = l.reverse()
    3 print("列表的反转:: ", res, l)
    4 
    5 res = l[::-1]
    6 print("切片反转:: ", res, l)
    
    

    输出结果:

    列表的反转:: None [5, 4, 3, 2, 1]
    切片反转:: [1, 2, 3, 4, 5] [5, 4, 3, 2, 1]

     
     
     
     
     
     
     
     


  • 相关阅读:
    Character Encoding题解(容斥)
    P1445 [Violet]樱花 题解(推式子)
    F. Stone 题解(对称博弈)
    M. 810975 题解(容斥)
    P1365 WJMZBMR打osu! / Easy 题解(期望dp)
    icpc济南
    C#创建windows服务并定时执行
    批处理 windows 服务的安装与卸载
    前台单击文件,jQuery删除后台相应真实的文件
    Jquery直接调用后台方法(WebMethod框架的使用)
  • 原文地址:https://www.cnblogs.com/cxq0017/p/9394103.html
Copyright © 2020-2023  润新知