首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python3列表切片:类方法中的特定用法

Python3列表切片:类方法中的特定用法
EN

Stack Overflow用户
提问于 2020-02-04 01:20:44
回答 2查看 144关注 0票数 1

我已经在这里看到了很多Python列表切片问题,我不认为我在重复任何东西,尽管它涉及到许多相同的问题。我的问题与使用切片缩短列表、创建新列表和更新原始列表有关。

我的任务是定义一个接受两个参数(word_list, num)并使用切片操作word_listClass方法。我一直在切片,直到word_list为空,将每个切片存储在一个新的列表中。就切片的内容而言,我从哪一端切片并不重要,重要的是我可以保持切片并保持事件的准确记录。

请执行以下操作:

代码语言:javascript
运行
复制
word_list = ["once", "upon", "a", "time", "there", "lived", "an", "old", "man"]

sub_list1 = word_list[:2] # ["once", "upon"]
word_list = word_list[2:] # ["a", "time", "there", "lived", "an", "old", "man"]

请将此与

代码语言:javascript
运行
复制
word_list = ["once", "upon", "a", "time", "there", "lived", "an", "old", "man"]

sub_list2 = word_list[-2:] # ["old", "man"]
word_list = word_list[:-2] # ["once", "upon", "a", "time", "there", "lived"]

在上面的第一个例子中,列表元素在获取切片时被“向下分流”,而第二个例子中,列表只是变短了,没有任何东西“移动”。我是在发明一个问题,还是以不同的方式对word_list进行切片有任何实际的影响?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-04 02:00:56

扩展切片语法的工作方式是创建一个slice对象以传递给适当的__getitem__方法。foo[x:y:z]变成了foo.__getitem__(slice(x, y, z))

对于缺少的值,不做任何假设;值None被简单地传递给slice。所以你的表情变成了

代码语言:javascript
运行
复制
word_list[:2]   -> word_list.__getitem__(slice(None, 2, None))
word_list[2:]   -> word_list.__getitem__(slice(2, None, None))
word_list[:-2]   -> word_list.__getitem__(slice(None, -2, None))
word_list[-2:]   -> word_list.__getitem__(slice(-2, None, None))

如何处理每个None值由__getitem__的实现决定。通常,上下文会被考虑在内。如果步骤是正的,则将缺少的开始视为0;如果步骤为负,则将其视为-1。不管开始和停止位置如何,缺少的步骤通常缺省为1;这就是为什么像foo[10:0]这样的东西是空的,而不是假设您想使用-1的步骤。

票数 2
EN

Stack Overflow用户

发布于 2020-02-04 01:52:03

我不确定我是否理解了你的问题,但我看不出你的第一个和第二个例子之间有任何实际的影响,这只是你的解释

你可以看一看性能是一样的:

代码语言:javascript
运行
复制
import numpy as np
import struct
import sys

from simple_benchmark import BenchmarkBuilder
b = BenchmarkBuilder()

@b.add_function()
def positive_slicing(my_list):
    sub_list = my_list[:2]
    my_list = my_list[2:]

@b.add_function()
def negative_slicing(my_list):
    sub_list = my_list[-2:]
    my_list = my_list[:-2]

@b.add_arguments('slicing list')
def argument_provider():
    for exp in range(2, 7):
        size = 10**exp
        yield size, ['some random example'] * size

r = b.run()
r.plot()

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60044155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档