Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中向集合类型添加元素而不更改集合类型_Python - Fatal编程技术网

在Python中向集合类型添加元素而不更改集合类型

在Python中向集合类型添加元素而不更改集合类型,python,Python,假设我有一个类,可以使用元组、列表、字典或其他类型的对象集 大概是这样的: class AbstractClass: """An example class""" def __init__(self, items=None): self.items = items def items(self): """Returns the items that

假设我有一个类,可以使用元组、列表、字典或其他类型的对象集

大概是这样的:

class AbstractClass:
    """An example class"""

    def __init__(self, items=None):
        self.items = items

    def items(self):
        """Returns the items that this instance has"""
        return self.items
def add_item(self, item):
    """Adds item to items"""
    # code goes here
现在我想添加如下方法:

class AbstractClass:
    """An example class"""

    def __init__(self, items=None):
        self.items = items

    def items(self):
        """Returns the items that this instance has"""
        return self.items
def add_item(self, item):
    """Adds item to items"""
    # code goes here
现在我被卡住了。我不想检查items是否是列表、元组等,然后根据具体情况进行检查(因为它似乎不符合语法),但似乎没有一种方法可以通用。我还希望尝试保留该类型,因此我不希望将项目转换为列表(例如),然后使用列表的方法添加项目(使用
items.append(item)
items+[item,]
)。有什么建议吗

以下是预期行为的有限示例列表:

列表

a = AbstractClass([1, 2])
a.add_item(4) # a.items now contains [1, 2, 4] in any order
元组

a = AbstractClass((1, 2))
a.add_item(4) # a.items now contains (1, 2, 4) in any order
字典(注意:这本字典实际上是可选的,因为我不希望使用它)


注意:这并不意味着要在实践中使用,我只是想测试python动态特性的限制您可以这样做,它将适用于所有标准集合类型:

def add_item(self, item):
    # You could use append here, and it'd be faster
    temporary_list = list(self.items) + [item]
    self.items = type(self.items)(temporary_list)
这是因为
type(x)
返回该对象的“type”。要提取出实际的类型字符串(“列表”、“集合”、“元组”等),我们必须进行一些字符串操作。然后,我们可以构造一条语句,等价于:

# For lists
self.items = list(temporary_list)
# For sets
self.items = set(temporary_list)
# And so on...

编辑:我不知道为什么我被否决了。Stackoverflow建议不要在不解释原因的情况下进行向下投票。

如果不想使用isinstance(),可以检查您认为有效的方法名称:


你想要什么样的行为?您根本无法向元组添加新元素。向dict添加内容意味着同时添加一个键和一个值,而向列表添加内容则只是添加一个值。在概念层面上,向每种结构“添加项”的方式是不同的,因此不清楚一般的
add_item
应该做什么。没有通用的方式来添加项、dict、元组和列表等。。是非常不同的结构。将项目添加到dict中意味着什么?是关键还是价值?或者您的项目总是2元组?通过向元组添加元素,我可能意味着我的元组将成为包含原始元素和新元素的元组。至于dict,我希望它只是将其添加到一个未使用的键中,如果有可能的话。老实说,为什么您要向dict添加没有任何意义的值的键,您有一种方法来添加项,这样您以后在代码中添加任何其他内容时都必须检查您说不想做的类型,接受这样一个事实,即你不能做你想做的事情。这基本上是以个案为基础的,这正是问题海报所说的他不想要的。这是一个更一般的问题,并不完全取决于随着时间的推移对python类型的更改,因此它确实比简单的个案要好。但是,它不处理元组(元组是不可变的,因此需要一个单独的大小写)。OP不想对类型进行逐项处理,但如果按方法进行处理,则可能会有更少的选择。我没有投你反对票,但我猜投反对票的人可能已经投了反对票,因为你的解决方案可能非常缓慢,而且更重要的是,没有人喜欢exec/eval,因为它不是真正必要的(几乎从来都不是)。我理解,但它是有效的,而且它是唯一真正的方法,不需要逐案进行。你真的尝试过这个吗?这行不通。即使您可以这样做,也不需要使用
exec
来执行。您可以直接调用
type(self.items)
。但由于几个原因,它无论如何都不会起作用。例如,在dict上调用
list
只会返回一个键列表,所以所有的值信息都会被丢弃。您不能直接调用类型(self.items)!你为什么不试试呢。无论如何,字典绝对没有办法做到这一点,所以这是一个适用于列表、集合和元组的解决方案。对于字典,你必须要有键和值的参数,这些参数会有很多问题,这根本不起作用,所以我没有把它们包括在我的答案中。如果OP澄清了他的理论对象将如何与字典一起使用,那么我会编辑我的答案以适应变化。是的,你可以。您的exec行可以替换为
self.items=type(self.items)(临时列表)
。这确实适用于元组、列表和集合,但如果说它适用于所有容器类型,那么当问题特别提到dicts时,这是一种误导。我同意这个问题是不恰当的,但这只是意味着可能没有正确的答案。