Python: определение класса только с определенными целыми числами - PullRequest
0 голосов
/ 19 декабря 2009

Я определяю класс, в котором используется только набор целых чисел.

Я не могу использовать следующие типы данных при определении моего класса: set, frozenset and dictionaries.

мне нужна помощь в определении:

remove(self,i): целое число i удалено из набора. Исключение возникает, если я не в себе.

discard(self, i): целое число i удалено из набора. Никаких исключений не возникает, если я не в себе

Ответы [ 4 ]

2 голосов
/ 19 декабря 2009

Если вы используете внутренний список, основанный на том, что вы сказали, вы можете сделать это так:

class Example(object):
    def __init__(self):
        self._list = list()

    # all your other methods here...

    def remove(self, i):
        try:
            self._list.remove(i)
        except ValueError:
            raise ValueError("i is not in the set.")

    def discard(self, i):
        try:
            self._list.remove(i)
        except ValueError:
            pass

remove() пытается удалить элемент и перехватывает ValueError списка, чтобы он мог выдать свой собственный. discard() делает то же самое, но вместо этого ничего не делает, если происходит ошибка ValueError.

1 голос
/ 19 декабря 2009

Здесь крайне неэффективная, но полная реализация с использованием MutableSet ABC :

import collections


class MySet(collections.MutableSet):

    def __init__(self, iterable=tuple()):
        self._items = []
        for value in iterable:
            self.add(value)

    def discard(self, value):
        try: self._items.remove(value)
        except ValueError:
            pass

    def add(self, value):
        if value not in self:
           self._items.append(value)

    def __iter__(self):
        return iter(self._items)

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

    def __contains__(self, value):
        return value in self._items

Из collections.MutableSet источник:

def remove(self, value):
    if value not in self:
       raise KeyError(value)
    self.discard(value)
1 голос
/ 19 декабря 2009

Я не могу использовать следующие типы данных при определении моего класса: набор, frozenset и словари.

Похоже, вы собираетесь использовать список. Вы можете использовать метод списка remove и обрабатывать исключения соответствующим образом.

0 голосов
/ 21 декабря 2009

Вот что я сделал с дублированием, возьмите несколько идей из него

combList = list1 + list2

combList.sort()
last = combList[-1]
for i in range(len(combList)-2, -1, -1):
        if last == combList[i]:
                del combList[i]
        else:
                last = combList[i]

combList.sort()

for i in range(len(combList)):
        print i+1, combList[i] 

Я полностью согласен с LiOliQ, единственный способ - сделать это списком.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...