列表的一些特点:

  1. 列表是最常用的线性数据结构

  2. list是一系列元素的有序组合

  3. list是可变的

列表的操作,

  1. 增:append、extend、insert

  2. 删:clear、pop、remove

  3. 改:reverse、sort

  4. 查:count、index

  5. 其他:copy

>>> [a for a in dir(list) if not a.startswith('__')]
['append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

定义与初始化列表

lst = list() # 使用list函数定义空列表
lst = [] # 使用中括号定义空列表
a = [1, 2, 3] # 使用中括号定义带初始值的列表
lst = list(range(1, 10)) # 使用list函数把可迭代对象转化为列表
a_ref = aa[2] = 100

列表的访问

可以通过下标访问列表中的元素,下标从0开始。当下标超出范围时,会抛出IndexError异常。下标可以是负数,负数下标从右开始,与正数下标刚好相反。负数下标从-1开始。不管是正数的下标还是负数的下标,只要超出范围,就会抛出异常。

lst = [1, 2, 3]
print(lst[0])
print(lst[2])
# print(lst[3])

列表常用操作

我们可以通过列表的下标(或索引)找到相应的元素,也可以通过列表元素找到其相应的索引。列表提供了index方法可以实现此需求,接下来我们就看一下如何使用列表的index方法。

lst = [1, 2, 3, 2, 5]help(lst.index)
 : Help on built-in function index:
 : 
 : index(...) method of builtins.list instance
 :     L.index(value, [start, [stop]]) -> integer -- return first index of value.
 :     Raises ValueError if the value is not present.
 :

index可以有其他两个参数,start,stop可以为负数,但是总是从左往右查找。

index方法根据值返回第一个索引。

a_copy = a[:]
a.append(300) # 在列表的末尾增加一个元素
a.insert(1, 50) # 在指定位置增加一个元素,如果索引超出范围,如果是正索
# 引,等效于append,如果索引为负数,等效于insert(0, object)。
a.pop() # 默认从列表最后移除一个元素,可以指定索引;索引不能超出范围
a.sort() # 排序方法a.reverse() # 反转方法
a.remove(value) # 移除列表中第一次出现的value,如果value不存在,则抛出ValueError异常
del a[1]

列表的count方法用于返回列表里出现元素的个数,如果没有就返回0。

lst = [1, 2, 3, 2, 3, 5]
print(lst.count(2))
print(lst.count(5))
# there was no element 0
print(lst.count(0))

count方法的原型:

def count(lst, value):
    c = 0
    for x in lst:
        if x == value:
            c += 1
    return c 

index和count的时间复杂度是O(n)线性复杂度(效率与数据规模成线性相关)。

由于列是可变的数据结构,因此可以对列表的元素可以进行修改。修改列表的元素直接使用下标操作取出元素并对其赋值即可。

lst = [1, 2, 3, 2, 4, 3, 5]
print(lst[2])
lst[2] = 5
print(lst[2])
# 对超出范围的索引修改元素,会抛出IndexError异常
# lst[7] = 7

增加列表元素,使用修改列表元素的方法不能增加列表元素。可以使用append方法来增加列表的元素,

lst = [1, 3, 5, 7]

lst.append(9)
print(lst)
lst.extend([1, 2, 3])
print(lst)
lst.extend(range(3))
print(lst) # remove
# 根据值来删除
# 从左到右删除第一次出现的元素
lst.remove(1)
print(lst)
# 删除一个不存在的值时,会抛出ValueError异常
# lst.remove(10)# pop
# 默认返回并删除最后一个元素
lst.pop()
print(lst)
# pop可以有参数
# 返回并删除索引所在位置的元素
lst.pop(1)
print(lst)
# 当pop不存在的索引时,抛出IndexError异常
# lst.pop(100)

运行结果为:

 : [1, 3, 5, 7, 9]
 : [1, 3, 5, 7, 9, 1, 2, 3]
 : [1, 3, 5, 7, 9, 1, 2, 3, 0, 1, 2]
 : [3, 5, 7, 9, 1, 2, 3, 0, 1, 2]
 : [3, 5, 7, 9, 1, 2, 3, 0, 1]
 : [3, 7, 9, 1, 2, 3, 0, 1] 

append与extend的对比:

  • append原地修改列表,返回None

  • extend原地修改,返回None

  • append操作单个元素

  • extend操作可迭代对象

pop与remove的对比:

  • pop是弹出索引对应的值

  • remove是删除最左边的第一次出现的值

  • pop针对的是索引

  • remove针对的是值

  • pop不传递index参数时,其时间复杂度为O(1)

  • pop传递index参数时,其时间复杂度为O(n)

insert可以在指定的位置处插入元素。当insert时,索引超出范围时:

  • 索引是负数,会在第0个元素前插入元素

  • 索引是正数,会在最后一个元素后插入元素

lst = [1, 3, 5, 7]
lst.insert(2, 'm')
print(lst)
lst.insert(10, 'e')
print(lst)
lst.insert(-10, 'a')
print(lst)

运行结果为:

: [1, 3, 'm', 5, 7]
: [1, 3, 'm', 5, 7, 'e']
: ['a', 1, 3, 'm', 5, 7, 'e']

insert操作的时间复杂度是O(n),append操作的时间复杂度是O(1)。

列表有copy的方法,

lst1 = [1, 3, 2, 5, 7]
lst2 = lst1 # 赋值操作,对可变对象是引用传递,对不可变对象是传值
print(lst2)
lst2.remove(2)
print(lst2)
print(lst1)
lst1 = [1, 3, 2, 5, 7]
lst2 = lst1.copy() # 影子拷贝
lst2.remove(2)
print(lst2)
print(lst1)

运行结果为:

: [1, 3, 2, 5, 7]
: [1, 3, 5, 7]
: [1, 3, 5, 7]
: [1, 3, 5, 7]
: [1, 3, 2, 5, 7]

赋值操作传递的是引用,也叫浅拷贝。

copy方法的原型:

def copy(lst):
    tmp = []
    for i in lst:
        tmp.append(i)
    return tmp

清除列表,

lst.clear() # 删除所有元素

求list的长度,

lst = []
print(len(lst))
lst = list(range(4))
print(len(lst))

列表反转,

列表排序,原地修改,返回None。默认是顺序排列,

lst.sort()
lst.sort(reverse=True)

去除列表中重复元素,

L1 = ['b', 'c', 'd', 'b', 'c', 'a', 'a']
L2 = []
[L2.append(i) for i in L1 if not i in L2]
print(L2)
: ['b', 'c', 'd', 'a']
iter = (x ** 2 for x in range(10) if x % 2 == 0)
iter
<generator object <genexpr> at 0x1056b42b0>>>>
for el in iter:
print(el)
0
4
16
36
64
###>>> print [(x, y) for x in (1, 2, 3, 4) for y in (10, 15, 3, 22) if x * y > 25]
[(2, 15), (2, 22), (3, 10), (3, 15), (3, 22), (4, 10), (4, 15), (4, 22)]

来看几个跟列表应用的例子,

# 求素数的列表使用法lst = []for n in range(2, 101):
    for x in lst:
        if n % x == 0:
            break
        else:
            lst.append(n)
            print(n)

一个例子

一个可以输出直方图的例子,代码如下:

(venv) [lavenliu@VM_171_247_centos mysite]$ cat hist.py 
# 从一个列表中创建一个直方图
values = [] # 首先创建一个空列表# 我们输入10个整数
print("Enter 10 integers:")
for i in range(10):
newValue = int(input("Enter integer %d: " % (i+1)))
values += [newValue]
# 创建直方图
print("\nCreating a histogram from values:")
print("%s %10s %10s" % ("Element", "Value", "Histogram"))
for i in range(len(values)):
print("%7d %10d  %s" % (i, values[i], "*" * values[i]))

运行结果为:

venv lavenliu@VM_171_247_centos mysite$ python hist.py 
Enter  integers:
Enter integer 1: 10
Enter integer 2: 8
Enter integer 3: 23
Enter integer 4: 15
Enter integer 5: 2
Enter integer 6: 5
Enter integer 7: 7
Enter integer 8: 9
Enter integer 9: 6
Enter integer 10: 4
Creating a histogram from values:
Element      Value  Histogram
                 **********
                  ********                 ***********************      
                 ***************      
                  **                  *****      
                  *******                  *********                  ******                  ***

Python基础语法-内置数据结构之列表的更多相关文章

  1. Python内置数据结构之列表list

    1. Python的数据类型简介 数据结构是以某种方式(如通过编号)组合起来的数据元素(如数.字符乃至其他数据结构)集合.在Python中,最基本的数据结构为序列(sequence). Python内 ...

  2. Python基础知识2-内置数据结构(下)

    bytes.bytearray #思考下面例子: a = 1 b = a print(a == b)#True print(a is b)#True print(id(a) is id(b))#Fal ...

  3. Python基础知识2-内置数据结构(上)

     分类 数值型 用浮点型的时候注意别和"=="一起使用. 数字的处理函数 注意round()函数的特殊:四舍六入五取偶 类型判断 列表list 列表list定义 初始化 列表索引访 ...

  4. [PY3]——内置数据结构(1)——列表及其常用操作

    列表及其常用操作_xmind图         about列表 列表是一个序列,用于顺序存储数据 列表分为两种:ArrayList(用数组实现).LinkedList(用链表实现) 定义与初始化 #l ...

  5. Python基础语法04-数据结构

    Python Number(数字) Python Number 数据类型用于存储数值. 数据类型是不允许改变的,这就意味着如果改变 Number 数据类型的值,将重新分配内存空间. Python 支持 ...

  6. 【python基础语法】字符串常用方法 、列表(第3天课堂笔记)

    """ 字符串的方法 join 字符串拼接,将列表转换为字符串 find 查找元素位置 count 查找元素个数 replace 替换字符 split 字符串分割,将字符 ...

  7. Python的4个内置数据结构

    Python提供了4个内置数据结构(内置指可以直接使用,无需先导入),可以保存任何对象集合,分别是列表.元组.字典和集合. 一.列表有序的可变对象集合. 1.列表的创建例子 list1 = []lis ...

  8. python面试总结4(算法与内置数据结构)

    算法与内置数据结构 常用算法和数据结构 sorted dict/list/set/tuple 分析时间/空间复杂度 实现常见数据结构和算法 数据结构/算法 语言内置 内置库 线性结构 list(列表) ...

  9. Python第五章-内置数据结构01-字符串

    Python 内置的数据结构 ​ 到目前为止,我们如果想保存一些数据,只能通过变量.但是如果遇到较多的数据要保存,这个时候时候用变量就变的不太现实. ​ 我们需要能够保存大量数据的类似变量的东东,这种 ...

随机推荐

  1. Ionic学习

    1. 原来Http不能直接加在普通类里,下面的报错 import { Component } from '@angular/core'; import { NavController } from ' ...

  2. 解决linux ubuntu不能识别华为手机的问题--升级内核

    敝人手中有一个华为mate8,但是debian, ubuntu及一系列衍生版均不能识别.只能识别出一个华为手机助手,但是无法使用华为的内置存贮. 在fedora上是可以完美使用的. 归根到底的原因,是 ...

  3. Spring中@Autowired注解、@Resource注解的区别 (zz)

    Spring中@Autowired注解.@Resource注解的区别 Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource.@ ...

  4. 821. Shortest Distance to a Character

    class Solution { public: vector<int> shortestToChar(string S, char C) { int len=S.length(); ve ...

  5. 2019.01.14 bzoj2648: SJY摆棋子(kd-tree)

    传送门 kd−treekd-treekd−tree模板题. 题意简述:支持在平面上插入一个点,求对于一个点的最近点对. 思路:cdqcdqcdq是一种很不错的分治方法 只是好像码量有点窒息 所以我用了 ...

  6. (10)The secret to great opportunities? The person you haven't met yet

    https://www.ted.com/talks/tanya_menon_the_secret_to_great_opportunities_the_person_you_haven_t_met_y ...

  7. 哪些优秀的 Windows 小工具,类似 clover 或 everything

    有哪些优秀的 Windows 小工具,类似 clover 或 everything? 目前已知的有everything, listary, total commander, clover, dexpo ...

  8. 最全js表单验证

    /***************************************************************** 表单校验工具类 (linjq) ***************** ...

  9. math.net 拟合

    参考:http://blog.csdn.net/ztmsimon/article/details/50524392 在论坛中总看到有人在说Math.NET Iridium,查了一下,现在被整合到Mat ...

  10. IP之ALTIOBUF仿真

    这里实现了差分转单端的功能. 问题:差分信号的电平是怎样的?如果像平常一样不设置Pin Planner中的电平的话,编译会报错. 在Pin Planner中做了如下设置: `timescale 1 n ...