gpt4 book ai didi

python - 通常只切片列表/元组的一个元素?

转载 作者:太空宇宙 更新时间:2023-11-03 18:15:43 25 4
gpt4 key购买 nike

这个slice(-1,0)从一段实际代码中掉出来,它看起来几乎像一个切片换行,但事实并非如此。

评论:我怀疑实际的“切片包装”将是另一个挑战。

在“几乎包裹”切片的情况下,简单的解决方法是在这种特殊情况下删除上限:

AEIOU[-1:], AEIOU[-1:None], or (more quirkilly) AEIOU[-1:5]

更一般的尝试:(我正在使用:Python 2.6.6)

AEIOU[start%len(AEIOU): stop%len(AEIOU)] # simply struggles. 

但是鉴于负成员函数 __getitem__ 始终有效,“几乎包裹”的成员 __getslice__ 只是返回太短的内容,这有点奇怪(危险) .

问题:

  1. 是否存在特定的设计原因导致“近包裹”切片较短,而不是(可能)引发IndexError:(列表/字符串/元组)索引超出范围”异常 ?

  2. 如何创建列表的子类来管理它?

  3. Python 3.0 中的处理方式是否有所不同?

演示:

>>> AEIOU="AEIOU"
>>> for i in range(-len(),5,1): print "%-16s, %r, %r"%(slice(i,i+1,1),AEIOU[i],AEIOU[i:i+1])
...
slice(-5, -4, 1), 'A', 'A'
slice(-4, -3, 1), 'E', 'E'
slice(-3, -2, 1), 'I', 'I'
slice(-2, -1, 1), 'O', 'O'
slice(-1, 0, 1) , 'U', '' # missing U...
slice(0, 1, 1) , 'A', 'A'
slice(1, 2, 1) , 'E', 'E'
slice(2, 3, 1) , 'I', 'I'
slice(3, 4, 1) , 'O', 'O'
slice(4, 5, 1) , 'U', 'U'

我注意到一般的“解决方法”是:

>>> i=-1; AEIOU[i:i%len(AEIOU)+1]
'U' # found U

勘误表,切片示例:

>>> s=3
>>> for i in range(-len(AEIOU),5,1): print "%-16s, %r, %r, %r"%(slice(i,i%len(AEIOU)+s,1),AEIOU[i],AEIOU[i:i+s], AEIOU[i:i%len(AEIOU)+s])
...
slice(-5, 3, 1) , 'A', 'AEI', 'AEI'
slice(-4, 4, 1) , 'E', 'EIO', 'EIO'
slice(-3, 5, 1) , 'I', '', 'IOU'
slice(-2, 6, 1) , 'O', '', 'OU'
slice(-1, 7, 1) , 'U', '', 'U'
slice(0, 3, 1) , 'A', 'AEI', 'AEI'
slice(1, 4, 1) , 'E', 'EIO', 'EIO'
slice(2, 5, 1) , 'I', 'IOU', 'IOU'
slice(3, 6, 1) , 'O', 'OU', 'OU'
slice(4, 7, 1) , 'U', 'U', 'U'

最佳答案

负索引从列表末尾开始倒数,但如果它们足够大,它们可能会超过开头。当它们超出范围时,它们只需固定到列表中的第一项即可。

items = range(10)
items[-10:-9]
# 0
items[-20:-9]
# 0

正索引从列表开头开始计数。如果超出范围,它们也会固定在列表末尾:

items[9:10]
#[9]

items[9:100]
#[9]

与常规的getitem访问不同,列表边界之外的索引只是被固定到末尾。通常这会返回一个空切片:

items[99:100]
#[]

items[-99:-88]
#[]

您的示例中出现特殊情况是因为 'aeiou'[-1:0]'aeiou'[4:0] 相同 - 并且因为这是一个长度为负但步长为正的切片,因此它是空的。如果您输入 'aeiou'[4:0:-1],您将得到 'uoie'

由于固定行为,无法保证返回的切片将包含与说明符之间的距离相同数量的项目。切片是一个很好的习惯用法,可以在没有事先边界检查的情况下获取项目,这与我认为您所要求的相反:

stuff = ['a','b','c']
d = stuff[11:12]
# []

stuff[11]
#IndexError: list index out of range

如果您确实需要知道您的查询超出范围,您必须预先检查索引:

def strict_slice(the_list, begin, end):
listlen = len(the_list)
if begin > listlen or begin + listlen < 0:
raise IndexError, 'start index out of bounds'
if end + listlen < 0 or end > listlen:
raise IndexError, 'end index out of bounds'
return the_list[begin:end]


test = 'abcdefg'
strict_slice(test, 1, 3)
strict_slice(test, -10, 3)
# IndexError: start index out of bounds
strict_slice(test, 1, 20)
#IndexError: end index out of bounds

虽然您可以子类化 list 来执行此操作,但对我来说,使用此配方或仅检查空切片似乎更容易。

关于python - 通常只切片列表/元组的一个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25049926/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com