草庐IT

列表(list)

思必得_22 2023-04-15 原文

4.4 列表(list)

列表是Python中使用最频繁也是最重要最灵活的一种数据结构。Python列表中的元素类型可以不同,可以存放各种各样的数据,比如:数字、字符串、函数、类、字典等,甚至还可以嵌套存放列表。
列表也是一种序列,可以通过索引获取列表中的元素。支持序列的各种操作。

4.4.1 列表的创建

4.4.1.1 通过列表标识符号创建

列表在创建的时候用[]做标识。内部的元素用逗号进行分隔。
>>> lst1 = [] # 空列表
>>> lst2 = [1, 1, 2, 3, 5] # 列表中存放的全是数字
>>> lst3 = ['a', 'b', 'c'] # 列表中存放的全是字符
>>> lst4 = [1, 'a', '中'] # 列表中存放混合数据
>>> lst5 = ['red', 'green', 'blue'] # 列表中存放的全是字符串

4.4.1.2 通过列表推导创建

>>> [x for x in range(5)]

[0, 1, 2, 3, 4]

>>> [x * x for x in range(10)]

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

>>> [x*x for x in range(10) if x%3 == 0]

[0, 9, 36, 81]

>>> [[x, y] for x in range(3) for y in range(3)]

[[0, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2], [2, 0], [2, 1], [2, 2]]

>>> [[x, y] for x in range(5) for y in range(5) if y >= x]

[[0, 0], [0, 1], [0, 2], [0, 3], [0, 4], [1, 1], [1, 2], [1, 3], [1, 4], [2, 2], [2, 3], [2, 4], [3, 3], [3, 4], [4, 4]]

4.4.1.3 通过list函数创建

list函数可以将一个可迭代对象转换成列表。
>>> print(list('Python'))

['P', 'y', 't', 'h', 'o', 'n']

4.4.1.4 列表的拼接和重复

参见可迭代对象章节中的序列的拼接和重复

4.4.2 列表的访问

4.4.2.1 列表索引

参见可迭代对象章节中的序列的索引

4.4.2.2 列表切片

参见可迭代对象章节中的序列的切片

4.4.2.3 遍历列表

参见可迭代对象章节中的可迭代对象的遍历

4.4.2.4 成员资格检查

参见可迭代对象章节中的成员资格检查

4.4.3 列表的修改

列表不同于字符串,是可以原地修改的。

4.4.3.1 单个元素的修改

可以通过索引的方式修改单个元素:
>>> lst = ['P', 'y', 't', 'h', 'o', 'n']
>>> lst[0] = 'J'
>>> lst

['J', 'y', 't', 'h', 'o', 'n']

4.4.3.2 多个元素的修改

可以通过切片的方式修改多个元素:
>>> lst = ['P', 'y', 't', 'h', 'o', 'n']
>>> lst[0:4] = 'Java'
>>> lst

['J', 'a', 'v', 'a', 'o', 'n']

>>> lst = ['P', 'y', 't', 'h', 'o', 'n']
>>> lst[0:4] = ['Java']
>>> lst

['Java', 'o', 'n']

4.4.4 列表的删除

4.4.4.1 删除列表元素

通过索引删除单个元素
>>> lst = ['P', 'y', 't', 'h', 'o', 'n']
>>> del lst[0]
>>> print(lst)

['y', 't', 'h', 'o', 'n']

通过切片删除多个元素
>>> lst = ['P', 'y', 't', 'h', 'o', 'n']
>>> del lst[0:2]
>>> lst

['t', 'h', 'o', 'n']

4.4.4.2 删除整个列表

>>> lst = ['P', 'y', 't', 'h', 'o', 'n']
>>> del lst
>>> lst

Traceback (most recent call last):
File "E:\studypy\tmp.py", line 3, in
print(lst)
NameError: name 'lst' is not defined. Did you mean: 'list'?

4.4.5 列表的方法

4.4.5.1 增加元素

4.4.5.1.1 append(x)

描述
在列表末尾添加一个元素,相当于a[len(a):] = [x]。
示例

lst = list('Python')
lst.append('1')
print(lst)

['P', 'y', 't', 'h', 'o', 'n', '1']

4.4.5.1.2 extend(iterable)

描述
用可迭代对象的元素扩展列表。相当于 a[len(a):] = iterable。
示例

lst = list('Python')
lst.extend('Java')
print(lst)

['P', 'y', 't', 'h', 'o', 'n', 'J', 'a', 'v', 'a']

lst1 = [1, 2, 3]
lst2 = [4, 5, 6]
lst1.extend(lst2)
print(lst1)

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

4.4.5.1.3 insert(i, x)

描述
在指定位置插入1个元素。第一个参数是插入元素的索引,因此,a.insert(0, x) 在列表开头插入元素,a.insert(len(a), x) 等同于 a.append(x)。
示例

lst = list('Python')
lst.insert(0, 'Java')
print(lst)

['Java', 'P', 'y', 't', 'h', 'o', 'n']

4.4.5.2 删除元素

4.4.5.2.1 remove(x)

描述
从列表中删除第一个值为 x 的元素。未找到指定元素时,触发 ValueError 异常。
示例

lst = list('Python')
lst.remove('o')
print(lst)
lst.remove('o')
print(lst)

['P', 'y', 't', 'h', 'n']
Traceback (most recent call last):
File "E:\studypy\tmp.py", line 4, in
lst.remove('o')
ValueError: list.remove(x): x not in list

4.4.5.2.2 pop([i])

描述
删除列表中指定位置的元素(第i个元素,如果索引越界了则会报错:IndexError),并返回被删除的元素。
未指定位置时,a.pop() 删除并返回列表的最后一个元素。
示例

lst = list('Python')
lst.pop()
print(lst)
lst.pop(0)
print(lst)
lst.pop(10)
print(lst)

['P', 'y', 't', 'h', 'o']
['y', 't', 'h', 'o']
Traceback (most recent call last):
File "E:\studypy\tmp.py", line 6, in
lst.pop(10)
IndexError: pop index out of range

4.4.5.2.3 clear()

描述
删除列表里的所有元素,相当于 del lst[:]。
注意:del lst[:] 是情况整个列表,使得列表为空。列表还存在,只不过是个空的列表(里面没有元素了)。而 del lst是删除这个列表。列表不存在了,再次引用该列表则会报错。
示例

lst = list('Python')
lst.clear()
print(lst)

[]

4.4.5.3 查询统计类

4.4.5.3.1 count(x)

参见可迭代对象章节中序列小节中的序列count方法

4.4.5.3.2 index(x[, start[, end]])

参见可迭代对象章节中序列小节中的序列index方法

4.4.5.3.3 sort(*, key=None, reverse=False)

描述
就地排序列表中的元素,要了解自定义排序参数,详见后面的sorted函数。
示例

lst = list('Python132')
lst.sort(reverse=True)   # 倒序
print(lst)
lst = list('Python132')
lst.sort(reverse=False)  # 顺序
print(lst)

['y', 't', 'o', 'n', 'h', 'P', '3', '2', '1']
['1', '2', '3', 'P', 'h', 'n', 'o', 't', 'y']

4.4.5.3.4 reverse()

描述
就地翻转列表中的元素。
示例

lst = list('Python132')
lst.reverse()
print(lst)

['2', '3', '1', 'n', 'o', 'h', 't', 'y', 'P']

4.4.5.4 其它

4.4.5.4.1 copy()

描述
返回列表的拷贝。相当于 lst[:] 。
示例

lst = list('Python')
lst2 = lst.copy()
print(lst2)

['P', 'y', 't', 'h', 'o', 'n']

4.4.6 用列表实现堆栈和队列

4.4.6.1 实现堆栈

使用列表方法实现堆栈非常容易,最后插入的最先取出(“后进先出”)。把元素添加到堆栈的顶端,使用 append() 。从堆栈顶部取出元素,使用 pop() ,不用指定索引。例如:

stack = [3, 4, 5]
stack.append(6)
stack.append(7)
print(stack)
stack.pop()
print(stack)
stack.pop()
stack.pop()
print(stack)

[3, 4, 5, 6, 7]
[3, 4, 5, 6]
[3, 4]

4.4.6.2 实现队列

列表也可以用作队列,最先加入的元素,最先取出(“先进先出”);然而,列表作为队列的效率很低。因为,在列表末尾添加和删除元素非常快,但在列表开头插入或移除元素却很慢(因为所有其他元素都必须移动一位)。
实现队列最好用 collections.deque,可以快速从两端添加或删除元素。例如:

from collections import deque
queue = deque(["red", "green", "blue"])
queue.append("black")
queue.append("white")
print(queue)
queue.popleft()
print(queue)
queue.pop()
print(queue)
print(list(queue))

deque(['red', 'green', 'blue', 'black', 'white'])
deque(['green', 'blue', 'black', 'white'])
deque(['green', 'blue', 'black'])
['green', 'blue', 'black']

有关列表(list)的更多相关文章

  1. ruby - RVM 使用列表[0] - 2

    是否有类似“RVMuse1”或“RVMuselist[0]”之类的内容而不是键入整个版本号。在任何时候,我们都会看到一个可能包含5个或更多ruby的列表,我们可以轻松地键入一个数字而不是X.X.X。这也有助于rvmgemset。 最佳答案 这在RVM2.0中是可能的=>https://docs.google.com/document/d/1xW9GeEpLOWPcddDg_hOPvK4oeLxJmU3Q5FiCNT7nTAc/edit?usp=sharing-知道链接的任何人都可以发表评论

  2. Ruby on Rails regexp equals-tilde 与 array include 用于检查选项列表 - 2

    我正在使用Rails3.2.3和Ruby1.9.3p0。我发现我经常需要确定某个字符串是否出现在选项列表中。看来我可以使用Ruby数组.includemethod:或正则表达式equals-tildematchshorthand用竖线分隔选项:就性能而言,一个比另一个好吗?还有更好的方法吗? 最佳答案 总结:Array#include?包含String元素,在接受和拒绝输入时均胜出,对于您的示例只有三个可接受的值。对于要检查的更大的集合,看起来Set#include?和String元素可能会获胜。如何测试我们应该根据经验对此进行测试

  3. ruby-on-rails - Rails - Carrierwave 进程抛出 ArgumentError : no images in this image list - 2

    在尝试实现应用auto_orient的过程之后!对于我的图片,我收到此错误:ArgumentError(noimagesinthisimagelist):app/uploaders/image_uploader.rb:36:in`fix_exif_rotation'app/controllers/posts_controller.rb:12:in`create'Carrierwave在没有进程的情况下工作正常,但在添加进程后尝试上传图像时抛出错误。流程如下:process:fix_exif_rotationdeffix_exif_rotationmanipulate!do|image|

  4. Ruby:如何将数组拼接成 Lisp 风格的列表? - 2

    这是我发现自己偶尔想做的事情。假设我有一个参数列表。在Lisp中,我可以像这样`(imaginary-function,@args)为了调用将数组从一个元素转换为正确数量的参数的函数。Ruby中是否有类似的功能?或者我只是在这里使用了一个完全错误的成语? 最佳答案 是的!它被称为splat运算符。a=[1,44]p(*a) 关于Ruby:如何将数组拼接成Lisp风格的列表?,我们在StackOverflow上找到一个类似的问题: https://stackov

  5. ruby-on-rails - Ruby on Rails 将列表拆分或切片为列 - 2

    @locations=Location.all#currentlistingall@locations=Location.slice(5)orLocation.split(5)使用Ruby,我试图将我的列表分成4列,每列限制为5个;然而,切片或拆分似乎都不起作用。知道我可能做错了什么吗?任何帮助是极大的赞赏。 最佳答案 您可能想使用in_groups_of:http://railscasts.com/episodes/28-in-groups-of这是RyanBates在railscast中的示例用法:

  6. ruby-on-rails - 将 acts_as_list 与 has_many 一起使用 :through in rails - 2

    我有一个Rails应用程序,我正在尝试使用acts_as_list插件设置可排序列表。数据库中的位置字段正在更新,但是在呈现页面时,不考虑顺序。我想我是在寻求帮助。这是我的模型...classQuestionMembership:question_membershipsendclassQuestion:question_membershipsacts_as_listend还有给我列表的草率View代码...>true)%>拖放用于重新排序。数据库中QuestionMembership对象的位置值更新,页面实际上正确显示重新排序。问题是在页面重新加载时,它默认返回到它感觉的任何顺序。我认

  7. Ruby 删除可枚举列表中的重复项 - 2

    ruby中有没有一个很好的方法来删除可枚举列表中的重复项(即拒绝等) 最佳答案 对于数组你可以使用uniq()方法a=["a","a","b","b","c"]a.uniq#=>["a","b","c"]所以如果你只是(1..10).to_a.uniq或%w{antbatcatant}.to_a.uniq因为无论如何,几乎所有您实现的方法都将作为Array类返回。 关于Ruby删除可枚举列表中的重复项,我们在StackOverflow上找到一个类似的问题: h

  8. ruby-on-rails - Scaffold Rails 3 View 中的外键下拉列表 - 2

    我使用脚手架和Rails3创建了2个模型。模型是位置和作业,每个作业都有一个位置。我在脚手架生成代码中创建了所需的引用调用,但是当我查看创建新作业的View时,我看到的只是一个文本框,我应该在其中添加location_id。我怎样才能让它变成下拉菜单以获得更好的用户体验? 最佳答案 想象一下,您有每个位置的titleAPI:http://apidock.com/rails/ActionView/Helpers/FormOptionsHelper/collection_select 关于r

  9. ruby - 如何在 Ruby 中创建数字列表并将其反向附加到它 - 2

    给定一个最小整数和最大整数,我想创建一个数组,它从最小值到最大值以二为单位计数,然后倒退(再次以二为单位,重复最大数)。例如,如果最小数是1,最大数是9,我想要[1,3,5,7,9,9,7,5,3,1].我试图尽可能简洁,这就是我使用单行代码的原因。在Python中,我会这样做:range(1,10,2)+range(9,0,-2)在我刚刚开始学习的Ruby中,到目前为止我所想到的是:(1..9).inject([]){|r,num|num%2==1?r这行得通,但我知道必须有更好的方法。这是什么? 最佳答案 (1..9).step

  10. ruby - Ruby 参数列表中的单个拼音/星号是什么意思? - 2

    这个问题在这里已经有了答案:nakedasteriskasparameterinmethoddefinition:deff(*)(1个回答)关闭9年前。我今天浏览了Rails3ActiveRecord源代码,发现amethodwheretheentireparameterlistwasasingleasterisk.defsave(*)我找不到很好的描述来说明它的作用(尽管我有一些基于我对splat参数的了解的想法)。它有什么作用,为什么要使用它?

随机推荐