繁体   English   中英

Python3 列表切片:类方法中的具体使用

[英]Python3 list slice: specific use in class method

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

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

采取以下措施:

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"]

将此与

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进行切片有任何实际含义?

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

不对缺失值做任何假设; None简单地传递给slice 所以你的表情变成

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))

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

不确定我是否理解您的问题,但我看不到您的第一个和第二个示例之间的任何实际含义,这只是您的解释

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

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()

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM