简短版:
我刚刚读过关于扩展切片的知识,并且已经知道可以将切片元组传递给__getitem__
:
a[::3, 1::3]
然而,你不能将切片传递给任意函数(如果我错了请纠正我),因此这将失败:
f(::3, 1::3)
以某种方式繁琐的解决方法是调用slice
:
f(slice(None, None, 3), slice(1, None, 3))
1。对于列表有[]
的片段文字(理解),对于字典和集合是{}
还是对于生成器和元组有()
? (也许<start, end, step>
或其他)
2。是否可以以整齐的切片表示法将切片传递给任意函数?
长版(TL; DR):
如果我想在列表的不同切片上合并,即找到这些切片的第一个元素而不是False
,那么如果我能够通过众所周知且非常简洁的切片,那就太好了这个函数的表示法。现在解决方案可能如下,但我不确定这是不明智的:
#! /usr/bin/python3.3
class Array(list):
class Coalescer:
def __init__(self, array):
self.array = array
def __getitem__(self, slices):
if not isinstance(slices, tuple):
slices = (slices,)
for s in slices:
for e in self.array[s]:
if e: return e
return None
@property
def coalesce(self):
return Array.Coalescer(self)
a = Array ([0, 0, 2, 0, 3, 4, 0, 5, 6])
print(a.coalesce[:]) #2
print(a.coalesce[::3]) #None
print(a.coalesce[1::3]) #3
print(a.coalesce[::3, 1::3]) #3
a [6] = 42
print(a.coalesce[::3, 1::3]) #42
恕我直言,这比a.coalesce(slice(None, None, 3), slice(1, None, 3))
甚至coalesce(a, slice(None, None, 3), slice(1, None, 3))
更具可读性。
第3。这是一个可行的选择还是不使用__getitem__
4。是否有PEP或其他文件提供了何时以及如何覆盖__getitem__
的指导方针,更重要的是在何时以及如何不覆盖?
5。在您的估计意见中,哪种方法最适合实现在有序切片列表上合并的函数?
非常感谢。
答案 0 :(得分:2)
首先我会建议使用NumPy或pandas并创建一个刚收到的函数,正如@JanneKarila建议coalesce(a[::3])
但是如果你必须创建一个可以切片的对象并且具有也应该实现切片的函数,那么我将遵循Pandas库所采用的方法。
您有一个DataFrame(不要打扰名称)对象df
,您可以使用df[1:3]
但是如果你想要一些特殊的切片,那么他们实现了另一个对象,它引用了第一个也实现切片的对象,可用作第一个对象df.ix[3:5]
的属性。
您的实现看起来像这样:
class SpecialSlicer(object):
def __init__(self, obj):
self.obj = obj
def __getitem__(self, ...):
return sefl.obj[...]
class Array(object):
def __init__(self):
# do your stuff
self.ss = SpecialSlicer(self)
def __gettitem__(self, ...):
return ....
现在你可以这样做:
a = Array()
a[3:4]
a.ss[4:5]
但是,在这种情况下,如果我正确理解了问题,我会选择一个只接收已经切片的对象的函数。