社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

Rudra1101001 • 3 年前 • 1265 次点击  

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

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
 
1265 次点击  
文章 [ 4 ]  |  最新文章 3 年前
user16519472 user16519472
Reply   •   1 楼
user16519472 user16519472    3 年前

我犯了一个错误 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    3 年前

当您使用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    3 年前

对象自行决定如何编制索引。当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    3 年前

在这种情况下, 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])