python散装笔记——20: 列表(1)


Python list 是一种在 Python 程序中广泛使用的通用数据结构。在其他语言中,它们通常被称为动态数组。它们既是可变的,又是序列数据类型,允许对它们进行索引和切分。list 可以包含不同类型的对象,包括其他 list 对象。

1: list方法和支持的操作符

从给定的列表 a 开始

a = [1, 2, 3, 4, 5]
  1. append(value) - 在列表末尾添加一个新元素。
# 将数值 6、7 和 7 添加到列表中
a.append(6)
a.append(7)
a.append(7)
# a: [1, 2, 3, 4, 5, 6, 7, 7]

# 追加另一个列表
b = [8, 9]
a.append(b)
# a: [1, 2, 3, 4, 5, 6, 7, 7, [8, 9]]

# 添加不同类型的元素,因为列表元素不需要具有相同的类型
my_string = "hello world"
a.append(my_string)
# a: [1, 2, 3, 4, 5, 6, 7, 7, [8, 9], "hello world"]

请注意,append() 方法只能将一个新元素追加到列表末尾。如果将一个列表追加到另一个列表 另一个 list,则追加的 list 将成为第一个 list 末尾的单个元素。

# 将一个列表追加到另一个列表
a = [1, 2, 3, 4, 5, 6, 7, 7]
b = [8, 9]
a.append(b)
# a: [1, 2, 3, 4, 5, 6, 7, 7, [8, 9]]
a[8]
# 返回: [8,9]
  1. extend(enumerable) - 通过添加来自另一个可数组的元素来扩展列表。
a = [1, 2, 3, 4, 5, 6, 7, 7]
b = [8, 9, 10]

# 通过追加 b 中的所有元素来扩展列表
a.extend(b)
# a: [1, 2, 3, 4, 5, 6, 7, 7, 8, 9, 10]

# 使用来自非 list 可枚举列表的元素扩展列表:
a.extend(range(3))
# a: [1, 2, 3, 4, 5, 6, 7, 7, 8, 9, 10, 0, 1, 2]

列表还可以使用 + 操作符进行连接。请注意,这不会修改任何原始列表:

b = [8, 9, 10]
a = [1, 2, 3, 4, 5, 6] + [7, 7] + b
# a: [1, 2, 3, 4, 5, 6, 7, 7, 8, 9, 10]
  1. index(value, [startIndex]) - 获取输入值第一次出现的索引。如果输入值不在列表中,则会出现 ValueError 异常。如果提供第二个参数,则从指定的索引开始搜索。
a.index(7)
# Returns: 6

a.index(49) # ValueError, because 49 is not in a.

a.index(7, 7)
# Returns: 7

a.index(7, 8) # ValueError, because there is no 7 starting at index 8
  1. insert(index, value) - 在指定的索引之前插入 value。因此,插入后,新元素将占据位置 index
a.insert(0, 0) # insert 0 at position 0
a.insert(2, 5) # insert 5 at position 2
# a: [0, 1, 5, 2, 3, 4, 5, 6, 7, 7, 8, 9, 10]
  1. pop([index]) - 删除并返回位于 index 处的项目。如果没有参数,则删除并返回列表中的最后一个元素。
a.pop(2)
# Returns: 5
# a: [0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 9, 10]
a.pop(8)
# Returns: 7
# a: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# With no argument:
a.pop()
# Returns: 10
# a: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  1. remove(value) - 删除指定值的第一次出现。如果找不到所提供的值,将引发 ValueError
a.remove(0)
# a: [1, 2, 3, 4, 5, 6, 7, 8, 9]
a.remove(9)
# a: [1, 2, 3, 4, 5, 6, 7, 8]

a.remove(10)
# ValueError, because 10 is not in a
  1. reverse() - 就地反转列表并返回 None。
a.reverse()
# a: [8, 7, 6, 5, 4, 3, 2, 1]

还有其他方法可以逆转列表。

  1. count(value) - 计算某个值在列表中出现的次数。
a.count(7)
# Returns: 2
  1. sort() - 按数字和词典顺序对列表排序,并返回 None。
a.sort()
# a = [1, 2, 3, 4, 5, 6, 7, 8]
# Sorts the list in numerical order

在使用 sort() 方法中的 reverse=True 标志进行排序时,还可以反转列表。

a.sort(reverse=True)
# a = [8, 7, 6, 5, 4, 3, 2, 1]

如果要按项目属性排序,可以使用关键字参数:

import datetime

class Person(object):
    def __init__(self, name, birthday, height):
        self.name = name
        self.birthday = birthday
        self.height = height
    def __repr__(self):
        return self.name

l = [Person("John Cena", datetime.date(1992, 9, 12), 175),
     Person("Chuck Norris", datetime.date(1990, 8, 28), 180),
     Person("Jon Skeet", datetime.date(1991, 7, 6), 185)]

l.sort(key=lambda item: item.name)
# l: [Chuck Norris, John Cena, Jon Skeet]

l.sort(key=lambda item: item.birthday)
# l: [Chuck Norris, Jon Skeet, John Cena]

l.sort(key=lambda item: item.height)
# l: [John Cena, Chuck Norris, Jon Skeet]

对于字典列表,概念是一样的:

import datetime

l = [{'name':'John Cena', 'birthday': datetime.date(1992, 9, 12),'height': 175},
     {'name': 'Chuck Norris', 'birthday': datetime.date(1990, 8, 28),'height': 180},
     {'name': 'Jon Skeet', 'birthday': datetime.date(1991, 7, 6), 'height': 185}]

l.sort(key=lambda item: item['name'])
# l: [Chuck Norris, John Cena, Jon Skeet]

l.sort(key=lambda item: item['birthday'])
# l: [Chuck Norris, Jon Skeet, John Cena]

l.sort(key=lambda item: item['height'])
# l: [John Cena, Chuck Norris, Jon Skeet]

按子命令排序:

import datetime

l = [{'name':'John Cena', 'birthday': datetime.date(1992, 9, 12),'size': {'height': 175,
'weight': 100}},
{'name': 'Chuck Norris', 'birthday': datetime.date(1990, 8, 28),'size' : {'height': 180,
'weight': 90}},
{'name': 'Jon Skeet', 'birthday': datetime.date(1991, 7, 6), 'size': {'height': 185,
'weight': 110}}]

l.sort(key=lambda item: item['size']['height'])
# l: [John Cena, Chuck Norris, Jon Skeet]

更好的方法是使用 attrgetteritemgetter 排序

还可以使用操作符模块中的 attrgetter 和 itemgetter 函数对列表进行排序。这有助于提高可读性和重用性。下面是一些示例、

from operator import itemgetter,attrgetter

people = [{'name':'chandan','age':20,'salary':2000}, 
          {'name':'chetan','age':18,'salary':5000},
          {'name':'guru','age':30,'salary':3000}]
by_age = itemgetter('age')
by_salary = itemgetter('salary')

people.sort(key=by_age) #in-place sorting by age
people.sort(key=by_salary) #in-place sorting by salary

itemgetter 也可以给定一个索引。如果要根据元组的索引进行排序,这将非常有用。

list_of_tuples = [(1,2), (3,4), (5,0)]
list_of_tuples.sort(key=itemgetter(1))
print(list_of_tuples) #[(5, 0), (1, 2), (3, 4)]

如果要按对象的属性排序,请使用 attrgetter

persons = [Person("John Cena", datetime.date(1992, 9, 12), 175), 
           Person("Chuck Norris", datetime.date(1990, 8, 28), 180),
           Person("Jon Skeet", datetime.date(1991, 7, 6), 185)] #reusing Person class from above example

persons.sort(key=attrgetter('name')) #sort by name
by_birthday = attrgetter('birthday')
persons.sort(key=by_birthday) #sort by birthday
  1. clear() - 删除列表中的所有项目
a.clear()
# a = []
  1. 副本复制

将现有列表乘以一个整数,就会产生一个更大的列表,其中包含相同数量的原始副本。例如,这对列表初始化很有用:

b = ["blah"] * 3
# b = ["blah", "blah", "blah"]
b = [1, 3, 5] * 5
# [1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5]

如果列表中包含对对象的引用(如列表的列表),请注意这样做,请参阅常见陷阱 - 列表乘法和共同引用。

  1. 元素删除

可以使用 del 关键字和切分符号删除列表中的多个元素:

a = list(range(10))
del a[::2]
# a = [1, 3, 5, 7, 9]

del a[-1]
# a = [1, 3, 5, 7]

del a[:]
# a = []
  1. 赋值复制

默认赋值 = 将原始列表的引用赋值给新名称。也就是说,原始名称和新名称都指向同一个列表对象。对其中任何一个对象所做的更改都会反映在另一个对象中。这往往不是你想要的结果。

b = a
a.append(6)
# b: [1, 2, 3, 4, 5, 6]

如果您想创建一份列表副本,您有以下选择。

您可以将其切片:

new_list = old_list[:]

您可以使用内置的 list() 函数:

new_list = list(old_list)

您可以使用通用的 copy.copy()

import copy
new_list = copy.copy(old_list) # 会插入对原文中对象的引用。

这比 list() 稍慢,因为它必须先找出 old_list 的数据类型。

如果列表中包含对象,而你又想复制它们,可以使用通用的 copy.deepcopy()

import copy

new_list = copy.deepcopy(old_list) # 插入原版中的对象副本。

这显然是最慢、最耗费内存的方法,但有时不可避免。

copy() - 返回列表的浅层副本

aa = a.copy()
# aa = [1, 2, 3, 4, 5]



相关文章

Python-1

在Jupyter 中显示txt文件的内容:linux ---> !cat tmp.txtwindowx ---> !more tmp.txt安装 Anacondaconda --->...

Python写每天进步1%的力量

离别了学生时代,步入了职场,你还记得你离上一次打开书本是在什么时候吗?认真上课,看学习视频,静下心来,虽唾手可得,却似乎离我们越来越远。每天忙着忙着,不知道自己忙什么,只是连坐下来停下思考5分钟的时间...

Python教程:第1篇 Python语言零基础从入门到高阶教程综述

目录前言本教程适合您吗?版权声明教程预告前言您好!欢迎您阅读本系列教程的第一篇文章。本教程是笔者准备写的系统化的、深入浅出的Python零基础从入门到高阶教程。零基础是指您可以没有任何编程经验,高阶是...

Python入门,一定要吃透这69个内置函数

内置函数就是Python预先定义的函数,这些内置函数使用方便,无需导入,直接调用,大大提高使用者的工作效率,也更便于程序的阅读。截止到Python版本3.9.1,Python一共提供了69个内置函数。...

使用 Python 编写 SolidWorks 脚本 01

大家好,欢迎来到我的频道。在本系列视频中,我将讨论使用Python编写Solidworks脚本。在开始之前,我将使用Solidworks2.21。对于Python IDE,我将使用Visual Stu...

用Python编写一个简单的计算器

本实战技能将创建多个函数,实现简单的 计算器功能。程序运行的时候,首先,会要求 用户选择运算的模式;其次,用户再输入待运 算的两个数字;最后,再调用函数将运行结果 展示出来。运行程序得到的结果如下图所...