在Python中将单个元素列表视为标量

2024-10-01 17:30:30 发布

您现在位置:Python中文网/ 问答频道 /正文

?是否可以定义一个python列表的子类,允许使用单元素列表变量,就好像它们是标量一样?在

例如,我希望能够:

class CustomList(list):
    ...
    ...

list1 = CustomList([2])
list2 = CustomList([3])
list3 = CustomList([4,5,6])
list4 = CustomList([{'foo':'bar'}])
list1 #should return list1[0]
list4['foo'] #should return list4[0]['foo'] = 'bar'
list1 + list2 #should return list1[0] + list2[0] = 5

但保持正常使用列表的能力:

^{pr2}$

Tags: 元素列表return定义foobar子类list
2条回答

是的,但是您实际上需要重写您希望它使用的任何方法。在

当您对像列表这样的对象调用某些运算符时,您最终会对这些对象调用隐藏方法。在您给出的示例result = list1 + list2中,实际调用的函数是list1.__add__(list2)。如果需要,可以将list子类化并重写这些方法。例如:

class CustomList(list):
    def __add__(self, value):
        if len(self) == 1 and len(value) == 1:
            return self[0] + value[0]
        else:
            return CustomList(list.__add__(self, value))

如果list1和{}的长度都为1,则将它们视为标量,否则将引用正常的list功能。This stackoverflow answer on subclassing ^{}可能对你有帮助。在


为了解决您的编辑问题,一个更通用的解决方案相当简单-不要重写__add__()函数,而是尝试重写__getitem__(),每当使用方括号运算符时都会调用它:

^{pr2}$

但是,当尝试连接数组时,这可能会导致问题;list3 + list1会导致错误,因为list1不是iterable,当然,如果列表的长度超过一个元素,则可以重写__add__来简单地添加第二个值作为列表元素。在


使用上述声明的控制台输出:

^{3}$

假设通过添加两个类意味着连接两个列表,您可以执行以下操作(请注意使用\uu add_uu方法查看如何进行添加):

from collections import MutableSequence

class CustomList(MutableSequence):
    def __init__(self, data=[]):
        self._list = data 

    def __add__(self, newlist):
        return self._list + newlist._list

    def __len__(self):
        return len(self._list)

    def __getitem__(self, i):
        return self._list[i]

    def __delitem__(self, i):
        del self._list[i]

    def __setitem__(self, i, val):
        self._list[i] = val

    def __str__(self):
        return str(self._list)

    def insert(self, i, val):
        self._list.insert(i, val)

相关问题 更多 >

    热门问题