我需要在Python的切片表示法上有一个很好的解释(引用是一个加号).
对我来说,这种符号需要一点点提升.
它看起来非常强大,但我还没有完全了解它.
在Python中,是否可以完全封装常见的切片语法并传递它?我知道我可以使用slice或__slice__模拟切片.但是我希望传递完全相同的语法,我将放在方括号中使用__getitem__.
例如,假设我编写了一个函数来返回列表的某些片段.
def get_important_values(some_list, some_condition, slice):
elems = filter(some_condition, some_list)
return elems[slice]
Run Code Online (Sandbox Code Playgroud)
如果我手动传入切片对象,这可以正常工作:
In [233]: get_important_values([1,2,3,4], lambda x: (x%2) == 0, slice(0, None))
Out[233]: [2, 4]
Run Code Online (Sandbox Code Playgroud)
但是我想让用户传递的内容与他们使用的切片完全相同__getitem__:
get_important_values([1,2,3,4], lambda x: (x%2) == 0, (0:-1) )
# or
get_important_values([1,2,3,4], lambda x: (x%2) == 0, (0:) )
Run Code Online (Sandbox Code Playgroud)
显然这会产生语法错误.但有没有办法让这项工作,而不是为x:y:t类型切片编写我自己的迷你解析器,并强制用户将它们作为字符串传递?
动机
我可以让这个示例函数返回一些可直接切片的东西,例如filter(some_condition, some_list),这将是作为列表的整个结果.然而,在我的实际例子中,内部函数要复杂得多,如果我知道用户想要的切片,我可以大大简化计算.但是我希望用户不必多做额外的事情就可以提前告诉我切片.
假设我想从Python中的列表中获取第一个元素,第3个到第200个元素,以及通过步骤大小3的最后一个元素的第201个元素.
一种方法是使用不同的索引和连接:
new_list = old_list[0:1] + old_list[3:201] + old_list[201::3]
Run Code Online (Sandbox Code Playgroud)
有没有办法只用一个索引来做到这一点old_list?我想要类似下面的内容(我知道这在语法上不起作用,因为列表索引不能是列表,因为Python遗憾的是没有切片文字 ;我只是在寻找接近的东西):
new_list = old_list[[0, 3:201, 201::3]]
Run Code Online (Sandbox Code Playgroud)
我可以通过切换到NumPy数组来实现其中的一些功能,但我对如何为原生Python列表执行此操作更感兴趣.我也可以创建一个切片制作器或类似的东西,并可能强大的手臂给我一个等效的切片对象来表示我所有我想要的切片的组成.
但我正在寻找一些不涉及创建新类来管理切片的东西.我想简单地连接切片语法并将其提供给我的列表,让列表理解它意味着分别获取切片并最终连接各自的结果.