Python字典集合类的初始化器

2024-06-14 18:52:48 发布

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

我很难弄清楚我应该如何初始化我的类。所以,当我这样做的时候,我会得到一个结果,但它也会返回布尔类型。我只想让它返回正常的数字有什么想法吗?例如赔率

class DictSet:

    def __init__(self, elements):
        self.elements = {}
        for i in elements:
            self.elements[i] = True

    def addElement(self, x):
        self.elements.update(x)

    def deleteElement(self, x):
        for i in (self.elements):
            if i == x:
                del self.elements[x]

    def member(self, x):
         for i in (self.elements):
            if i == x:
                return True
            return False                    #Checks if its an item

    def intersection(self, set2):
        add = []
        for i in self.elements:
            if i in set2.elements:
                add.append(i)
        return DictSet(add)  # Returns Intersected New List

    def union(self, set2):
        return DictSet(list(self.elements.keys()) + list(set2.elements.keys()))  #Puts all the elements together

    def subtract(self, set2):
        sub = []
        for i in self.elements:
            if i not in set2.elements:
                sub.append(i)
        return DictSet(sub)       # Only return ones set of elements

    def __repr__(self):
        return "<Set: " + str(self.elements) + ">"


def main():
    all = DictSet([1,2,3,4,5,6,7,8,9,10])
    odds = DictSet([1,3,5,7,9])
    evens = DictSet([2,4,6,8,10])
    print("all", odds.union(evens))
    print("all", evens.union(odds))
    print("empty", odds.intersection(evens))
    print("odds", all.intersection(odds))
    print("odds", all.subtract(evens))

if __name__ == '__main__':
    main()

无法正确格式化,所以会有一些格式化问题


Tags: inselfaddforreturnifdefelements
2条回答

因为您不想使用字典的值,而只想使用键,所以使用^{}而不是dict更合适:

A set object is an unordered collection of distinct hashable objects.

现在还不完全清楚你想要完成什么,但是我可以告诉你为什么你会得到你想要的结果。你知道吗

首先,我想指出的是__repr__函数决定了在对象上调用print时对象的显示方式。在__repr__方法中,有语句return "<Set: " + str(self.elements) + ">"。你的领域,self.elements。是一本字典。如果对字典使用str()函数,它会将字典转换为以{开始并以}结束的字符串,这样每个键/值对都会列出。您的键是整数1到10,并且您已经将所有值设置为True(根据您的__init__)。因此,对于您提供给我们的代码,您将看到输出:

('all', <Set: {1: True, 2: True, 3: True, 4: True, 5: True, 6: True, 7: True, 8: True, 9: True, 10: True}>)

因为self.elementsstr()方法生成输出{1: True, 2: True, 3: True, 4: True, 5: True, 6: True, 7: True, 8: True, 9: True, 10: True}。如果只想显示('all', <Set: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]>),则需要将__repr__更改为只显示self.elements键(而不是键和值)。你可以这样做:

__repr__(self): return "<Set: " + str([key for key in self.elements]) + ">"

[key for key in self.elements]根据list comprehensionself.elements字典字段创建键列表。你知道吗

或者,由于您的其他代码中已经有类似的内容,您可以执行以下操作:

__repr__(self): return "<Set: " + str(self.elements.keys()) + ">"

我认为__repr__的最后一个定义更清楚一点,第一个定义就是我脑海中立刻浮现的。你知道吗

我还想指出的是,如果我所描述的输出是您的最终目标,那么self.elements就不需要字典类型。只使用一个列表会更清楚/更好。你知道吗

相关问题 更多 >