Python的多个切片

时间:2016-08-11 11:59:56

标签: python

我需要从数组中的多个位置提取数据。

一个简单的数组是: -

listing = (4, 22, 24, 34, 46, 56)

我熟悉切片。例如: -

listing[0:3]

会给我: -

(4, 22, 24)

但是我无法获得多个切片。例如: -

listing[0:3, 4:5]

给了我

TypeError: tuple indices must be integers not tuples

尽管搜索了两本Python书籍和互联网,但我无法确定要使用的语法。

7 个答案:

答案 0 :(得分:9)

您可以切片两次并加入它们。

listing[0:3] + listing[4:5]

答案 1 :(得分:2)

这是Friedrich的惊人答案的稍微改进的版本。在这里:

class Advanced_List():
  def __init__(self, *args, is_list = True):
    self.array = list(args) if is_list else args
    self.islist = is_list
  def __iter__(self):
    yield from self.array
  def __getitem__(self, slices):
    return sum([[self.array[s]] if type(s) == int else self.array[s] for s in slices], []) if type(slices) == tuple else self.array[slices] #No more multidimensional shorthand!
  def __str__(self):
    return str(self.array)
  def __repr__(self):
    return str(self)[1:-1]
  #Look at the __getitem__ method

编辑1:

更改了__getitem__行。现在,单个切片不需要逗号!

答案 2 :(得分:1)

尝试:

>>> listing = (4, 22, 24, 34, 46, 56)
>>> listing[0:3], listing[4:5]
((4, 22, 24), (46,))

答案 3 :(得分:1)

如果您具有切片的索引号,则可以使用列表中包含的循环来获取它们。

index_nums = [0,2,4]
output = [listing[val] for val in index_nums]

这将返回[4,24,46]

答案 4 :(得分:1)

在上课时,您可以这样做

class Listing():
    def __init__(self, *args):
        self.array = args
    def __getitem__(self, slices):
        return sum((self.array[s] for s in slices), ())

listing = Listing(4, 22, 24, 34, 46, 56)
listing[0:3, 4:5]   # (4, 22, 24, 46)

结构sum((...), ())连接元组(()+()+()),因此将输出flattens连接起来。

答案 5 :(得分:0)

我需要这种精确的构造来应对大熊猫的情况。我使用了辅助生成器。

Python 3.7.4 (v3.7.4:e09359112e, Jul  8 2019, 14:54:52) 
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.

>>> listing = (4, 22, 24, 34, 46, 56)
>>> def multislice(a,sl):
...     for si in sl:
...         yield a[si]
... 
>>> list(multislice(listing,[slice(0,3),slice(4,5)]))
[(4, 22, 24), (46,)]

通过扩展,如何做很多不同的切片。

>>> list(multislice(listing,[slice(0,3),slice(4,5),slice(3,None)]))
[(4, 22, 24), (46,), (34, 46, 56)]

答案 6 :(得分:0)

处理 numpy 数组时,可以使用 np.r_ 生成索引

>>> np.array([4, 22, 24, 34, 46, 56])[np.r_[0:3, 4:5]]
array([ 4, 22, 24, 46])

这可以处理表单的多个切片,如 10:3:3-3:-1,但不正确的是 :、{{1} } 或 1:, -3: .