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

2. 基本数据结构-列表

程序员文章站 2022-06-24 14:05:17
一、列表定义 ​ List(列表)是python中使用最频繁的数据类型。列表可以完成大多数的数据结构实现。列表中元素的类型可以不同。它支持数字/字符串/列表(嵌套)。列表是写在[]之间的,用逗号分隔开的元素列表,和字符串一样。列表同样可以被索引和切片,列表被切片后返回一个包含所需元素的新列表。而且列 ......

一、列表定义

​ list(列表)是python中使用最频繁的数据类型。列表可以完成大多数的数据结构实现。列表中元素的类型可以不同。它支持数字/字符串/列表(嵌套)。列表是写在[]之间的,用逗号分隔开的元素列表,和字符串一样。列表同样可以被索引和切片,列表被切片后返回一个包含所需元素的新列表。而且列表是有序的(按照你保存的顺序),有索引,可切片方便取值。python可存放32/64位,列表是可变数据类型,不可hash。

二、列表切片

1. 示意图

2. 基本数据结构-列表

2. 列表切片操作

list = [ 'abcd', 786 , 2.23, 'run', 70.2 ]

1. 切片切得是什么类型,切后的数据就是什么类型
    tinylist = [123, 'runoob']
    print (list)            # 输出完整列表    ['abcd', 786, 2.23, 'run', 70.2]
    print (list[0])         # 输出列表第一个元素    abcd
    print (list[1:3])       # 从第二个开始输出到第三个元素     [786, 2.23]
    print (list[2:])        # 输出从第三个元素开始的所有元素    [2.23, 'run', 70.2]
    print (tinylist * 2)    # 输出两次列表    [123, 'run', 123, 'run']
    print (list + tinylist) # 连接列表   ['abcd', 786, 2.23, 'run', 70.2, 123, 'run']
    print(list1[-5:]) # 从第一元素取至最后一个,-5就是第一个元素['abcd', 786, 2.23, 'run', 70.2]    
    print(list[-5::2]) #增加步长,隔一个取一个   ['abcd', 2.23, 70.2]
    print(list[-1::-2])# 倒着取值    [70.2, 2.23, 'abcd']
    print(list[-1: ])    [70.2]
   
2.li = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    li[2:5] = [11, 22, 33, 44, 55]
    print(li)
    结果:[1, 2, 11, 22, 33, 44, 55, 6, 7, 8, 9]

三、列表操作

1. 添加

注意, list和str是不一样的. lst可以发生改变. 所以直接就在原来的对象上进行了操作

(1) append() - 尾部追加
lst = ["麻花藤", "林林俊杰", "周润发", "周芷若"]
print(lst)
lst.append("wusir")
print(lst)

lst = []
while true:    
    content = input("请输入你要录入的员工信息, 输入q退出:")
    if content.upper() == 'q':
            break    
    lst.append(content)
print(lst)

备注:
    append()是浅拷贝
    >>>alist = []
    >>> num = [2]
    >>> alist.append( num )
    >>> id( num ) == id( alist[0] )
    true
    如果使用 num[0]=3,改变 num 后,alist[0] 也随之改变。
    如不希望,需要使用 alist.append( copy.deepcopy( num ) )
(2) insert() - 插入
lst = ["麻花藤", "张德忠", "孔德福"]
lst.insert(1, "刘德华")    # 在1的位置插入刘德华. 原来的元素向后移动一位
print(lst)
(3) extend() - 列表扩展
用于在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)

1. 语法
    list.extend(seq)
    - seq:元素列表,可以是列表/元组/集合/字典,若为字典,则仅会将键(key)作为元素依次添加至原列表的末尾

2. 案例
    list1 = ['google', 'runoob', 'taobao']
    list2=list(range(5)) # 创建 0-4 的列表
    list1.extend(list2)  # 扩展列表
    print ("扩展后的列表:", list1)
    扩展后的列表: ['google', 'runoob', 'taobao', 0, 1, 2, 3, 4]

3. 其他案例
    # 语言列表
    language = ['french', 'english', 'german']
    # 元组
    language_tuple = ('spanish', 'portuguese')
    # 集合
    language_set = {'chinese', 'japanese'}

    # 添加元组元素到列表末尾
    language.extend(language_tuple)
    print('新列表: ', language)
    新列表:  ['french', 'english', 'german', 'spanish', 'portuguese']
    
    # 添加集合元素到列表末尾
    language.extend(language_set)
    print('新列表: ', language)
    新列表:  ['french', 'english', 'german', 'spanish', 'portuguese', 'japanese', 'chinese']

2. 删除

(1) pop()
用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值;list.pop([index=-1])

lst = ["麻花藤", "王剑林林", "李李嘉诚", "王富贵"]
print(lst)
# 默认删除最后一个
deleted = lst.pop()         
print("被删除的", deleted)
print(lst)
结果:
    ['麻花藤', '王剑林林', '李李嘉诚', '王富贵']
    被删除的 王富贵
    ['麻花藤', '王剑林林', '李李嘉诚']

# 删除2号元素
el = lst.pop(2)     
print(el)
print(lst)
(2) remove()
用于移除列表中某个值的第一个匹配项

# 删除指定元素
lst.remove("麻花藤")   
print(lst)
# 删除不存在的元素会报错
lst.remove("哈哈")    
print(lst)
error: valueerror: list.remove(x): x not in list
(3) clear()
- 清空list
(4) 切片删除
del lst[1:3]
print(lst)

3. 修改

lst = ["太白", "太黑", "五色", "银王", "日天"]
lst[1] = "太污"   # 把1号元素修改成太污
print(lst)

lst[1:4:3] = ["麻花藤", "哇靠"]     # 切片修改也ok. 如果步长不是1, 要注意元素的个数
print(lst)

lst[1:4] = ["李李嘉诚个龟儿子"]  # 如果切片没有步长或者步长是1. 则不用关心个数
print(lst)

4. 查询

1. index()

2.for el in lst:    
    print(el)

四、其他操作

1. count()

list.count(obj) #语法

alist = [123, 'google', 'runoob', 'taobao', 123];
print ("123 元素个数 : ", alist.count(123))
print ("runoob 元素个数 : ", alist.count('runoob'))
/结果:
123 元素个数 :  2
runoob 元素个数 :  1

2. len()

len(len) # 方法,返回列表个数
list1 = ['google', 'runoob', 'taobao']
print (len(list1))
list2=list(range(5)) # 创建一个 0-4 的列表
print (len(list2))
/结果:
3
5

3. list()

atuple = (123, 'google', 'runoob', 'taobao')
list1 = list(atuple)
print ("列表元素 : ", list1)

str="hello world"
list2=list(str)
print ("列表元素 : ", list2)
/结果:
列表元素 :  [123, 'google', 'runoob', 'taobao']
列表元素 :  ['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']

4. reverse()

函数用于翻向列表中元素

list1 = ['google', 'runoob', 'taobao', 'baidu']
list1.reverse()
print ("列表反转后: ", list1)
/结果:
列表反转后:  ['baidu', 'taobao', 'runoob', 'google']

5. sort()

list.sort(cmp=none, key=none, reverse=false)#该方法没有返回值,但是会对列表的对象进行排序
cmp -- 可选参数, 如果指定了该参数会使用该参数的方法进行排序。
key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
reverse -- 排序规则,reverse = true 降序, reverse = false 升序(默认)


alist = ['google', 'runoob', 'taobao', 'facebook']
alist.sort()
print ( "list : ", alist)
/结果:
list :  ['facebook', 'google', 'runoob', 'taobao']


vowels = ['e', 'a', 'u', 'o', 'i']# 降序
vowels.sort(reverse=true)
print ( '降序输出:', vowels )
/结果:
降序输出: ['u', 'o', 'i', 'e', 'a']
    
列表的嵌套
li = ['李娜', '韩寒', 'aliex', ['妮妮', 23,'北京']]
print(li[1][1]) # 取韩寒中的寒字
li[0] = li[0].capitalize() # 找的lina首字母大写,并将li中的lina替换掉
print(li)
li[1] = li[1].replace('韩', '国') # 将韩寒的韩改成国
print(li)
n = [1, 2, 'jack', 4, 5, 5, 6, 7, 78, 8, 9, 9]
n[3:4] = 'tony alix'
print(n)
[1, 2, 'jack', 't', 'o', 'n', 'y', ' ', 'a', 'l', 'i', 'x', 5, 5, 6, 7, 78, 8, 9, 9]
n[3:4] = ['tony', 'jone']
print(n)
[1, 2, 'jack', 'tony', 'jone', 5, 5, 6, 7, 78, 8, 9, 9]

6. join

将列表转换为字符串

li = ["李嘉诚", "麻花藤", "林海峰", "刘嘉玲"]
s = "_".join(li)   # 循环遍历列表,把列表中的每一项用''_''拼接
print(s)
结果:
李嘉诚_麻花藤_林海峰_刘嘉玲
li = "花闺"
s = "_".join(li)
print(s)
结果:
花_闺

7. 列表循环删除

li = ['周芷若', '王兴', '周润发', '马云', '周星星']
li_new = [] # 创建一个新列表存储要删除的元素

for el in li: # 循环li,把姓周的装进li_new
    if el.startswith('周'):
        li_new.append(el)

for el_new in li_new: # 循环新列表,删除li中的元素
    li.remove(el_new)
print(li)
结果:['王兴', '马云']

8. 列表浅拷贝

1. old = [1,[2,3]]
   new = old.copy()

2. old = [1,[2,3]]
  new = [i for i in old]

3. old = [1,[2,3]] 
   new = []
   for i in old:
        new.append(old[i])

4. old = [1,[2,3]]
   new = old[:]