Python基础语法-内置数据结构之列表

列表特性总结

列表的一些特点:

  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 10 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
      0         10  **********
      1          8  ********      
      2         23  ***********************      
      3         15  ***************      
      4          2  **      
      5          5  *****      
      6          7  *******      
      7          9  *********      
      8          6  ******      
      9          4  ****

原文发布于微信公众号 - 小白的技术客栈(XBDJSKZ)

原文发表时间:2017-08-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏计算机视觉与深度学习基础

Leetcode 214. Shortest Palindrome

Given a string S, you are allowed to convert it to a palindrome by adding chara...

1938
来自专栏小詹同学

Leetcode打卡 | No.19 删除链表的倒数第N个节点

之前我们说过 C 和 C++ 中的指针是个好东西 ,在解决这类问题很是方便 。然而 python 是没有这个概念的 ,包括链表也是模拟链表的相关操作 。刷题到这...

952
来自专栏HTML5学堂

查找字符串中出现最多的字符

HTML5学堂:正则、数组、字符串,是JavaScript语言中让人头痛的一些知识,今天这篇文章我们使用数组字符串的方法,来实现从一个字符串中,查找出现最多的字...

3784
来自专栏思考的代码世界

Python基础学习00天

1103
来自专栏https://www.cnblogs.com/L

Spark算子篇 --Spark算子之combineByKey详解

第二个函数:一开始a是初始值,b是分组内的元素值,比如A[1_],因为没有b值所以不能调用combine函数,第二组因为函数内元素值是[2_,3]调用combi...

732
来自专栏mwangblog

链表第一课

链表由节点(Node)组成,一个节点包含两个变量,一个变量存储我们需要保存的数据,另一个变量指向下一个节点,如下图所示:

833
来自专栏开发与安全

从零开始学C++之继承(二):继承与构造函数、派生类到基类的转换

一、不能自动继承的成员函数 构造函数(包括拷贝构造函数) 析构函数 =运算符 二、继承与构造函数 基类的构造函数不被继承,派生类中需要声明自己的构造函数。 ...

1870
来自专栏小狼的世界

Python 3.6学习笔记(一)

可以看到,注释以#开头,python的变量不需要任何前缀,行结束不需要结束符号,非常符合我们自然语言的阅读和书写习惯。当语句以:结尾时,缩紧的语句视为代码块。

782
来自专栏CaiRui

Shell-4-让文本飞

1.正则表达式 ^ 行起始标志 $ 行尾标记 . 匹配任意一个字符 [ ] 匹配包含在[字符]之中...

1779
来自专栏web前端-

JS对象和数组

对象的属性既可以存放基本数据类型也可以存放其他对象的引用值或者函数的引用值,如果存储的是函数的的引用值则该属性称为方法

532

扫码关注云+社区