Py学习  »  Python

Python-逗号分隔的切片不起作用

Rudra1101001 • 2 年前 • 421 次点击  

我见过很多人在分割多维列表时使用逗号。例如:

a = [[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]]
print(a[0:1, 2:4])

但出于某种原因,它对我不起作用。它引发了一个例外:

TypeError: list indices must be integers or slices, not tuple

我该怎么修理它???

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/130405
 
421 次点击  
文章 [ 4 ]  |  最新文章 2 年前
user16519472 user16519472
Reply   •   1 楼
user16519472 user16519472    2 年前

我犯了一个错误 MultiDimSlicer 就像你回答的那样,为这个切片上课。

class MultiDimSlicer:
    def __init__(self, data):
        self.data = data
    def __iter__(self):
        return iter(self.data)
    def __getitem__(self, keys):
        return eval("self.data" + self.__slicestr(keys))
    def __setitem__(self, keys, value):
        exec("self.data" + self.__slicestr(keys) + " = " + str(value))
    def __slicestr(self, keys):
        slice_str = ""
        if isinstance(keys[0], itertypes):
            good_keys = keys[0]
        else:
            good_keys = keys
        for key in good_keys:
            slice_str += "[" + str(key) + "]"
        return slice_str
    reuse = __init__
pu239
Reply   •   2 楼
pu239    2 年前

当您使用numpy数组而不是python的内置列表时,这是可能的。
例子:

a = [[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]]
print(a[0,1]) # returns an error
b = np.array(a)
print(b[0,1]) # returns 1

同样,也可以使用切片。

tdelaney
Reply   •   3 楼
tdelaney    2 年前

对象自行决定如何编制索引。当python看到 a[0:1, 2:4] 它首先为对象创建切片对象 : 分离值,然后将它们组合成元组: (slice(0, 1, None), slice(2, 4, None)) .该元组被传递到对象的 __getitem__ : a[(slice(0, 1, None), slice(2, 4, None))] .把那个元组传给 list.__getitem__ 它丢失了——它不认识这种类型的索引。把它放在一个数据框中,使用它的“iloc”索引,它就可以工作了。

>>> a = [[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]]
>>> a[0:1, 2:4]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: list indices must be integers or slices, not tuple
>>> import pandas as pd
>>> df = pd.DataFrame(a)
>>> df.iloc[0:1, 2:4]
   2  3
0  2  3

还有其他软件包,比如 pandas 这让我们对索引的含义产生了深刻的认识。所以要回答你的问题,这取决于你谈论的是什么类型的物体。不同的对象可以自由地以不同的方式解释切片。

de1
Reply   •   4 楼
de1    2 年前

在这种情况下, a 实际上只是一个嵌套列表,而不是一个真正的 矩阵 . 一旦你把它转换成 numpy 数组,访问这些切片将开始工作。

例如。:

import numpy as np

a = np.asarray([[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]])
print(a[0:1, 2:4])