Python Dict Set类初始化器

时间:2016-04-15 03:38:26

标签: 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()

无法正确格式化,因此会出现一些格式问题

2 个答案:

答案 0 :(得分:0)

由于您不想使用字典的值,而只想使用键,因此使用set代替dict更合适:

  

set对象是不同的可哈希对象的无序集合。

答案 1 :(得分:0)

我并不完全清楚你想要完成的事情,但我可以告诉你为什么你会得到你得到的输出。

首先,我要注意,它是__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.elements str()方法产生输出{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]self.elements字典字段创建一个按键列表,每list comprehension

或者,既然您已经在其他代码中使用了类似的内容,那么您可以这样做:

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

我认为__repr__的最后一个定义更清晰一点,第一个就是突然出现的问题。

我还要注意,如果我所描述的输出是您的最终目标,那么您不需要self.elements的字典类型。使用列表会更清楚/更好。