0

精简版:

我刚刚阅读了扩展切片并了解到可以将切片元组传递给__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. 在您看来,哪种方法最适合实现一个合并有序切片列表的函数?

非常感谢。

4

1 回答 1

2

首先,我建议使用 NumPy 或 pandas 并创建一个可以接收的函数,正如@JanneKarila 所建议的那样coalesce(a[::3])

但是,如果你必须创建一个可以切片的对象,并且它的函数也应该实现切片,我会遵循 Pandas 库所做的方法。

  1. 您有一个 DataFrame(不要打扰名称)对象df,您可以使用对其进行切片df[1:3]

  2. 但是如果你想要一些特殊的切片,那么他们实现了另一个对象,它引用了第一个也实现切片的对象,并且可以作为第一个对象的属性使用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]

但同样,在这种情况下,如果我正确理解了这个问题,我会选择一个只接收已经切片对象的函数。

于 2013-08-19T08:16:06.627 回答