library_for_python

This documentation is automatically generated by online-judge-tools/verification-helper

View the Project on GitHub Kazun1998/library_for_python

:warning: Unique_List.py

Code

from typing import TypeVar, Generic

class DuplicateValue(Exception):
    pass

T = TypeVar('T')
class Unique_List(Generic[T]):
    def __init__(self, A: list[T | None]):
        """ 要素の一意性が保証されたリストを生成する.

        Args:
            A (list[T]): 重複が存在しないリスト

        Raises:
            DuplicateValue: A に重複があったときに発生
        """

        index: dict[T, int] = {}
        for i, a in enumerate(A):
            if a is None:
                continue

            if a in index:
                raise DuplicateValue('重複する要素があります')

            index[a] = i

        self.__list = A
        self.__index = index

    def __repr__(self) -> str:
        return f"{self.__class__.__name__}({self.__list})"

    def update(self, i: int, a: T):
        """ 第 i 要素を a に変更する (変更後に重複する要素があってはいけない)

        Args:
            i (int): 変更する場所
            a (T): 変更後の値

        Raises:
            DuplicateValue: (変更後に重複する要素があってはいけない)
        """

        # 変わらないならば早期 Return
        if self[i] == a:
            return

        # 重複チェック
        if a in self.__index:
            raise DuplicateValue

        del self.__index[self[i]]

        if a is not None:
            self.__index[a] = i

        self.__list[i] = a

    def __getitem__(self, i: int) -> T:
        return self.__list[i]

    __setitem__ = update

    def __include__(self, a: T) -> bool:
        return a in self.__index

    def index(self, a: T, default = None) -> int:
        """ a がある場所を取得する (存在しない場合は default)

        Args:
            a (T): 探索する要素
            default (_type_, optional): 存在しない場合の返り値. Defaults to None.

        Returns:
            int: a がある場所
        """

        return self.__index.get(a, default)

    def swap(self, i: int, j: int):
        """ 第 i 要素と第 j 要素を交換する.

        Args:
            i (int):
            j (int):
        """

        a = self.__list[i]; b = self.__list[j]

        self.__list[i] = b; self.__list[j] = a
        self.__index[a] = j; self.__index[b] = i

    def transposition(self, a: T, b: T):
        """ 要素 a と要素 b を交換する.

        Args:
            a (T):
            b (T):
        """

        i = self.__index[a]; j = self.__index[b]

        self.__list[i] = b; self.__list[j] = a
        self.__index[a] = j; self.__index[b] = i
Traceback (most recent call last):
  File "/opt/hostedtoolcache/Python/3.13.3/x64/lib/python3.13/site-packages/onlinejudge_verify/documentation/build.py", line 71, in _render_source_code_stat
    bundled_code = language.bundle(stat.path, basedir=basedir, options={'include_paths': [basedir]}).decode()
                   ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/hostedtoolcache/Python/3.13.3/x64/lib/python3.13/site-packages/onlinejudge_verify/languages/python.py", line 96, in bundle
    raise NotImplementedError
NotImplementedError
Back to top page