GVKun编程网logo

如何用好Python的切片操作?(python切片的具体操作方法有哪些)

15

对于想了解如何用好Python的切片操作?的读者,本文将提供新的信息,我们将详细介绍python切片的具体操作方法有哪些,并且为您提供关于Python列表的切片取值详解、Algorithmacly加速

对于想了解如何用好Python的切片操作?的读者,本文将提供新的信息,我们将详细介绍python切片的具体操作方法有哪些,并且为您提供关于 Python列表的切片取值详解、Algorithmacly加速字符串切片操作-Python、Python / numpy棘手的切片问题、Python 之切片操作的有价值信息。

本文目录一览:

如何用好Python的切片操作?(python切片的具体操作方法有哪些)

如何用好Python的切片操作?(python切片的具体操作方法有哪些)

如何用好Python的切片操作?

答案1

小编典典

简单用法:

a[start:stop]  # items start through stop-1a[start:]      # items start through the rest of the arraya[:stop]       # items from the beginning through stop-1a[:]           # a copy of the whole array

使用步长

a[start:stop:step] # start through not past stop, by step

要记住的关键点是该:stop值表示不在所选切片中的第一个值。所以,之间的差stop和start是选择的元素的数量(如果step是1,默认值)。

另一个功能是start或stop可能是负数,这意味着它从数组的末尾而不是开头开始计数。所以:

a[-1]    # last item in the arraya[-2:]   # last two items in the arraya[:-2]   # everything except the last two items

step可能为负数:

a[::-1]    # all items in the array, reverseda[1::-1]   # the first two items, reverseda[:-3:-1]  # the last two items, reverseda[-3::-1]  # everything except the last two items, reversed

如果项目数量少于您的要求,Python对程序员很友好。例如,如果您要求a[:-2]并且a仅包含一个元素,则会得到一个空列表,而不是一个错误。有时您会更喜欢该错误,因此您必须意识到这种情况可能会发生。

与slice()对象的关系

[]上面的代码中实际上将切片运算符与slice()使用:符号的对象一起使用(仅在中有效[]),即:

a[start:stop:step]

等效于:

a[slice(start, stop, step)]

切片对象也表现略有不同,这取决于参数的个数,同样range(),即两个slice(stop)slice(start, stop[, step])支持。要跳过指定给定参数的操作,可以使用None,例如a[start:]等于a[slice(start, None)]a[::-1]等于a[slice(None, None, -1)]

尽管: 基于的符号对于简单切片非常有帮助,但是slice()对象的显式使用简化了切片的程序生成。

答案2

小编典典

列举语法允许的可能性:

>>> seq[:]                # [seq[0],   seq[1],          ..., seq[-1]    ]>>> seq[low:]             # [seq[low], seq[low+1],      ..., seq[-1]    ]>>> seq[:high]            # [seq[0],   seq[1],          ..., seq[high-1]]>>> seq[low:high]         # [seq[low], seq[low+1],      ..., seq[high-1]]>>> seq[::stride]         # [seq[0],   seq[stride],     ..., seq[-1]    ]>>> seq[low::stride]      # [seq[low], seq[low+stride], ..., seq[-1]    ]>>> seq[:high:stride]     # [seq[0],   seq[stride],     ..., seq[high-1]]>>> seq[low:high:stride]  # [seq[low], seq[low+stride], ..., seq[high-1]]

当然,如果(high-low)%stride != 0,则终点将比稍低high-1

如果stride为负,则由于我们递减计数,因此顺序有所更改:

>>> seq[::-stride]        # [seq[-1],   seq[-1-stride],   ..., seq[0]    ]>>> seq[high::-stride]    # [seq[high], seq[high-stride], ..., seq[0]    ]>>> seq[:low:-stride]     # [seq[-1],   seq[-1-stride],   ..., seq[low+1]]>>> seq[high:low:-stride] # [seq[high], seq[high-stride], ..., seq[low+1]]

扩展切片(带有逗号和省略号)通常仅由特殊的数据结构(如NumPy)使用;基本序列不支持它们。

>>> class slicee:...     def __getitem__(self, item):...         return repr(item)...>>> slicee()[0, 1:2, ::5, ...]''(0, slice(1, 2, None), slice(None, None, 5), Ellipsis)''

 Python列表的切片取值详解

Python列表的切片取值详解

1. 列表的切片

索引取值可以从列表中取出1个元素。

如果要从列表中取出多个元素,可以用列表的切片方法。

列表的切片语法和字符串的切片语法相同。

2. 切片的语法

【语法】

列表[star:end:step]

列表[开始字符:结束字符:步长]

列表切片取值由4部分构成:

列表名。

英文中括号。

3个参数。

3个参数之间用英文冒号分隔。

参数start:表示要取的第1元素的索引(包括该元素),如果不指定,则默认为0

参数end:表示要取的最后1个元素的索引(不包括该元素),如果不指定,则默认为列表的长度。

参数step:表示切片的步长。如果省略,则默认为1,当省略该步长时,最后一个冒号也可以省略。

步长我的理解就是向前或向后走几步,可以是正整数,也可以是负整数。

步长为1,表示向前走1步,那就是依次取值。

步长为2,表示一次性向前走2步,那就是要跳过1个字符。

步长为-2,表示一次性向后退2步,即从右往左跳过1个字符。

【重点提示】切片取值时包括开始字符,不包括结束字符,简单记忆为含前不含后

3. 切片取值示例

3.1 步长为1的切片取值

# 新建一个str列表
str_list = ["当归", "人参",  "黄芪", "红枣", "枸杞"]

print(str_list[0:1:1])
print("列表切片取值得到的数据类型仍然是列表:", type(str_list[0:1:1]), ''\n'')

print(str_list[1:4:1])
print("列表切片取值得到的数据类型仍然是列表:", type(str_list[1:4:1]), ''\n'')

print(str_list[2:5:1])
print("列表切片取值得到的数据类型仍然是列表:", type(str_list[2:5:1]), ''\n'')

【终端输出】

[''当归'']
列表切片取值得到的数据类型仍然是列表: <class ''list''> 

[''人参'', ''黄芪'', ''红枣'']
列表切片取值得到的数据类型仍然是列表: <class ''list''> 

[''黄芪'', ''红枣'', ''枸杞'']
列表切片取值得到的数据类型仍然是列表: <class ''list''> 

【2:5:1代码解析】

start=2即开始元素的索引为2,索引2对应列表的第3个元素,即元素黄芪

end=5即结束元素的索引为5,索引5对应列表的第6个元素;上述列表只有5个元素,没有第6个元素,因此取值范围为整个列表。

step=1即步长为1,即元素间隔为1,间隔为1表示可以连续取值。

注意切片的语法:含前不含后,即含开始元素,不含结束元素。

【步长为1时冒号和步长可以省略不写】

# 新建一个str列表
str_list = ["当归", "人参",  "黄芪", "红枣", "枸杞"]

print(str_list[0:1])

print(str_list[1:4])

print(str_list[2:5])

【终端输出】

[''当归'']
[''人参'', ''黄芪'', ''红枣'']
[''黄芪'', ''红枣'', ''枸杞'']

3.2 步长为3的切片取值

# 新建一个str列表
str_list = ["当归", "人参",  "黄芪", "红枣", "枸杞"]

print(str_list[0:4:3])
print("列表切片取值得到的数据类型仍然是列表:", type(str_list[0:1]), ''\n'')

【终端输出】

[''当归'', ''红枣'']
列表切片取值得到的数据类型仍然是列表: <class ''list''> 

【0:4:3代码解析】

start=0即开始元素的索引为0,索引0对应列表的第1个元素,即元素当归

end=4即结束元素的索引为4,索引4对应列表的第5个元素,即元素枸杞

注意切片的语法:含前不含后,即含开始元素,不含结束元素枸杞

step=3即步长为3,步长为3可以理解成一次性向前走3步,那就是要跳过2个字符。

注意切片的语法:含前不含后,即含开始元素,不含结束元素。

3.3 负索引取值

# 新建一个str列表
str_list = ["当归", "人参",  "黄芪", "红枣", "枸杞"]

print(str_list[-5:-1:3])

【终端输出】

[''当归'', ''红枣'']

# 新建一个str列表
str_list = ["当归", "人参",  "黄芪", "红枣", "枸杞"]

print(str_list[-5:-2:3])

【终端输出】

[''当归'']

# 新建一个str列表
str_list = ["当归", "人参",  "黄芪", "红枣", "枸杞"]

print(str_list[-5:-2:2])

【终端输出】

[''当归'', ''黄芪'']

# 新建一个str列表
str_list = ["当归", "人参",  "黄芪", "红枣", "枸杞"]

print(str_list[-2:-5:-2])

【终端输出】

[''红枣'', ''人参'']

-2到-5是从右往左,从右往左步长应该为负整数,下面的代码为正整数,因此没有取到任何元素。

# 新建一个str列表
str_list = ["当归", "人参",  "黄芪", "红枣", "枸杞"]

print(str_list[-2:-5:2])

【终端输出】

[]

到此这篇关于 Python列表的切片取值详解的文章就介绍到这了,更多相关 Python切片取值内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

您可能感兴趣的文章:
  • python列表切片和嵌套列表取值操作详解
  • Python列表的索引与切片
  • Python元素集合的列表切片
  • python 列表的查询操作和切片
  • python 实现列表的切片操作允许索引超出范围
  • Python列表切片常用操作实例解析

Algorithmacly加速字符串切片操作-Python

Algorithmacly加速字符串切片操作-Python

如何解决Algorithmacly加速字符串切片操作-Python?

@H_301_0@假设我有一个很大的文本文档。 我需要模仿文本编辑器的复制和粘贴操作。

@H_301_0@更具体地说, 我想编写两个函数copy(i,j)和paste(i),其中i和j代表文本文档中字符的索引。

@H_301_0@现在,我知道正常的字符串切片每次都会创建一个新的字符串对象,并且执行类似的操作

copy_text = str[i:j]
self.str = str[:i] + copy_text + str[j:]
考虑到我们在文本编辑器中执行复制粘贴功能的次数,@H_301_0@最终将导致大量新字符串对象的开销。

@H_301_0@我该怎么做?甚至有可能吗?

@H_301_0@我研究了 memoryview ,在其中他们使用了缓冲区,如果给他们创建原始对象的零拷贝视图,那么执行缓冲区可能会花费更少的时间。但是,我想通过算法来做到这一点,而不是在研究如何存储字符串。 我在考虑要存储字符串的数组行,并使用B +树存储指向该字符串的指针。我还没有真正实现任何东西。

@H_301_0@期待您的评论。谢谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

Python / numpy棘手的切片问题

Python / numpy棘手的切片问题

我有一些问题与一些numpy东西.我需要一个numpy数组以一种不寻常的方式表现,方法是返回一个切片作为我切片的数据的视图,而不是副本.所以这是我想要做的一个例子:

假设我们有一个这样的简单数组:

a = array([1,0])

我想用数组中的上一个条目更新数组中的连续条目(从左向右移动),使用如下语法:

a[1:] = a[0:3]

这将得到以下结果:

a = array([1,1,1])

或类似的东西:

a[1:] = 2*a[:3]
# a = [1,2,4,8]

为了进一步说明,我想要以下类型的行为:

for i in range(len(a)):
    if i == 0 or i+1 == len(a): continue
    a[i+1] = a[i]

除了我想要numpy的速度.

numpy的默认行为是获取切片的副本,所以我实际得到的是:

a = array([1,0])

我已将此数组作为ndarray的子​​类,因此如果需要,我可以对其进行进一步更改,我只需要右侧的切片不断更新,因为它会更新左侧的切片.

我梦想还是这种魔法可能?

更新:这都是因为我试图使用Gauss-Seidel迭代来解决线性代数问题,或多或少.这是一个涉及谐波函数的特殊情况,我试图避免进入这个,因为它真的没有必要,可能会进一步混淆事情,但这里有.

算法是这样的:

while not converged:
    for i in range(len(u[:,0])):
        for j in range(len(u[0,:])):
            # skip over boundary entries,i,j == 0 or len(u)
            u[i,j] = 0.25*(u[i-1,j] + u[i+1,j] + u[i,j-1] + u[i,j+1])

对?但是你可以用两种方式做到这一点,Jacobi涉及用它的邻居更新每个元素而不考虑你在while循环循环之前已经进行的更新,在循环中你要复制数组然后从复制的数组中更新一个数组.然而,Gauss-Seidel使用您已经为每个i-1和j-1条目更新的信息,因此不需要复制,循环应该基本上“知道”,因为在每个单元素更新后重新评估了数组.也就是说,每当我们调用像u [i-1,j]或u [i,j-1]这样的条目时,前一循环中计算的信息就会存在.

我想使用numpy切片用一个很好的简洁代码行替换这个缓慢而丑陋的嵌套循环情况:

u[1:-1,1:-1] = 0.25(u[:-2,1:-1] + u[2:,1:-1] + u[1:-1,:-2] + u[1:-1,2:])

但结果是Jacobi迭代,因为当你采用切片:u [:,– 2,1:-1]时,你复制了数据,因此切片不知道所做的任何更新.现在numpy还在循环吗?它不是平行的,它只是一种更快的循环方式,看起来像是python中的并行操作.我想利用这种行为通过一种黑客numpy来当我切片时返回一个指针而不是一个副本.对?然后,每次numpy循环,该片段将“更新”或真正只是复制更新中发生的任何事情.要做到这一点,我需要在数组的两侧切片作为指针.

无论如何,如果有一些非常聪明的人在那里真棒,但我几乎已经让自己相信唯一的答案是循环使用C.

解决方法

迟到的答案,但这出现在Google上,所以我可能会指出OP想要的文档.您的问题很明显:使用NumPy切片时,会创建临时图.通过快速调用weave.blitz来包装您的代码,以摆脱临时性并获得您想要的行为.

阅读PerformancePython tutorial的weave.blitz部分了解完整详情.

Python 之切片操作

Python 之切片操作

1、列表 list 中使用

1、range () 生成器

 就是 list 取值的一种方式。

  • 生成器 range (),用于写列表的范围,如果只写一个数,就表示从 0 开始,到写入的值 - 1:
l=list(range(10))#生成的是[0,1,2,3,4,5,6,7,8,9]
  • 如果写入范围,则是从写入的第一个数值开始,从写入的第二个数 - 1 结束:
l=list(range(1,11))
l=[''a'',''b'',''c'',''d'',''e'',''j'',''k'',''l'',''m'',''n'',''o'']
#   0   1   2   3   4   5   6   7   8   9   10
print(l[2:8])#顾头不顾尾
print(l[:5])#如果冒号前面没写的话,代表从0开始取的
print(l[4:])#如果冒号后面没写的话,代表取到最后
print(l[:])#如果冒号前后都没写的话,代表取全部

切片操作的特点:

  • 顾头不顾尾
  • 使用 range () 生成器时,如果冒号前面没写的话,代表从 0 开始取元素
  • 使用 range () 生成器时,如果冒号后面没写的话,代表取到最后的元素
  • 如果冒号前后都没写的话,代表取全部

 

2、 步长

步长是从自己元素开始,再走几步到想要的元素:

nums=list(range(1,11))
print(nums[1::2])#打印偶数
#1 2 3 4 5 6 ...10
print(nums[::2])#打印奇数
print(nums[::-2]) #取偶数,从右往左取值

步长特点:

  • 如果步长是正数的话,就从前往后开始取值;
  • 如果步长是负数的话,就从后往前开始取值,类似于 reverse ()。

 2、字符串中使用

字符串也有下标,使用上跟在列表中一致:

words=''中秋节要上课''
print(words[0])
print(words[::-1])

 3、面试题

#判断一个字符串是否是回文,即:字符串和它反转后的字符串是否相等,如果相等就是回文。
s=''上海自来水来自海上''
# 1232321
# 1111
# 回文算法,反过来倒过去都一样

for i in range(10):
    s = input(''请输入一个字符串:'')
    if len(s)<2:
        print(''字符串长度必须大于2'')
    elif s==s[::-1]: #.reverse()方法是列表中的方法,字符串中没有,因此只能用切片方法
        print(''是回文'')
    else:
        print(''不是回文'')

 

关于如何用好Python的切片操作?python切片的具体操作方法有哪些的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于 Python列表的切片取值详解、Algorithmacly加速字符串切片操作-Python、Python / numpy棘手的切片问题、Python 之切片操作的相关知识,请在本站寻找。

本文标签: