programing

Python은 주문 세트를 가지고 있습니까?

nicescript 2022. 12. 9. 22:03
반응형

Python은 주문 세트를 가지고 있습니까?

Python에는 순서가 있는 사전이 있습니다.주문 세트는요?

정답은 "아니오"입니다. 그러나 Python 표준 라이브러리에서 키(및 값)만으로 사용할 수 있습니다.None를 참조해 주세요를 참조해 주세요.

업데이트: Python 3.7(및 CPython 3.6), 표준dict질서가 유지되고 퍼포먼스가 향상됩니다.OrderedDict 하위 (「 」, 「 」, 「 」, 「 」, 「 」, 「 」, 「 」)를 계속 사용하는 것이 좋습니다.OrderedDict

가 있습니다.dict순서를 유지하면서 중복 항목을 필터링하여 순서 집합을 에뮬레이트합니다. 하다를 사용하세요.dict method 래 class classfromkeys(), 구하다, 구하다keys()syslog.syslog.syslog.

>>> keywords = ['foo', 'bar', 'bar', 'foo', 'baz', 'foo']

>>> list(dict.fromkeys(keywords))
['foo', 'bar', 'baz']

Python 2 Documentation에서 참조한 순서 세트(새로운 링크 가능성) 레시피가 있습니다.이 동작은 Py2.6 이후 및 3.0 이후에서는 변경되지 않고 실행됩니다.인터페이스는 목록으로 초기화해야 한다는 점을 제외하고는 일반 세트와 거의 동일합니다.

OrderedSet([1, 2, 3])

Set이므로 Mutable 세트,.union 「이 포함되어 있기 때문에, 「이것에는」이 포함되어 있습니다.__or__을 사용하다

@staticmethod
def union(*sets):
    union = OrderedSet()
    union.union(*sets)
    return union

def union(self, *sets):
    for set in sets:
        self |= set

업데이트: 이 답변은 Python 3.7에서는 사용되지 않습니다.더 나은 해결책은 위의 jrc의 답변을 참조하십시오.이 답변은 역사적 이유로만 여기에 보관합니다.


순서부여된 세트는 기능적으로 순서부여된 사전의 특수한 경우입니다.

사전의 키는 독특합니다.딕셔너리에서 를 들어 값을 )None를 가지고 있습니다는 기본적으로 순서가 있는 세트를 가지고 있습니다.

Python 3.1 및 2.7 현재가 있습니다.다음으로 Ordered Set의 구현 예를 나타냅니다(정의 또는 덮어쓸 필요가 있는 메서드는 거의 없습니다).collections.OrderedDict무거운 것을 들어 올립니다.)

import collections

class OrderedSet(collections.OrderedDict, collections.MutableSet):

    def update(self, *args, **kwargs):
        if kwargs:
            raise TypeError("update() takes no keyword arguments")

        for s in args:
            for e in s:
                 self.add(e)

    def add(self, elem):
        self[elem] = None

    def discard(self, elem):
        self.pop(elem, None)

    def __le__(self, other):
        return all(e in other for e in self)

    def __lt__(self, other):
        return self <= other and self != other

    def __ge__(self, other):
        return all(e in self for e in other)

    def __gt__(self, other):
        return self >= other and self != other

    def __repr__(self):
        return 'OrderedSet([%s])' % (', '.join(map(repr, self.keys())))

    def __str__(self):
        return '{%s}' % (', '.join(map(repr, self.keys())))
    
    difference = property(lambda self: self.__sub__)
    difference_update = property(lambda self: self.__isub__)
    intersection = property(lambda self: self.__and__)
    intersection_update = property(lambda self: self.__iand__)
    issubset = property(lambda self: self.__le__)
    issuperset = property(lambda self: self.__ge__)
    symmetric_difference = property(lambda self: self.__xor__)
    symmetric_difference_update = property(lambda self: self.__ixor__)
    union = property(lambda self: self.__or__)

Py에 구현PI

Python에 삽입 순서 보존 세트가 내장되어 있지 않다고 지적한 사람도 있습니다만(아직), 이 질문에는 PyPI에서 찾을 수 있는 것을 나타내는 답이 없는 것 같습니다.

패키지는 다음과 같습니다.

이러한 구현의 일부는 Raymond Hettinger가 ActiveState에 게시한 레시피에 기초하고 있습니다.이 레시피는 다른 답변에서도 언급되고 있습니다.

몇 가지 차이점

  • 순서 세트(버전 1.1)
  • 인덱스에 (1) O(1))my_set[5])
  • oset(버전 0.1.3)
  • O (1 : : O (1)remove(item)
  • 단점: 인덱스에 의한 룩업의 경우 명백한 O(n)

에도, 「O(1)」에 대해서 O(1)가.add(item) ★★★★★★★★★★★★★★★★★」__contains__(item) )item in my_set를 참조해 주세요.

Ordered Set보다 더 좋은 것을 드릴 수 있습니다.볼튼은 순수 Python, 2/3 호환 타입으로 주문 세트일 뿐만 아니라 색인(리스트와 같이)도 지원합니다.

말하면 ★★★★★★★pip install boltons copy(복사))setutils.py 합니다.IndexedSet아,아,아,아,아,아,아,아,아,아,아,아,아,아,아.

>>> from boltons.setutils import IndexedSet
>>> x = IndexedSet(list(range(4)) + list(range(8)))
>>> x
IndexedSet([0, 1, 2, 3, 4, 5, 6, 7])
>>> x - set(range(2))
IndexedSet([2, 3, 4, 5, 6, 7])
>>> x[-1]
7
>>> fcr = IndexedSet('freecreditreport.com')
>>> ''.join(fcr[:fcr.index('.')])
'frecditpo'

모든 것이 독특하고 순서대로 유지됩니다.★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★IndexedSet하지만 문제가 생기면 저를 귀찮게수도 있다는 의미이기도 합니다.:)

정렬된 순서를 유지하기 위해 정렬된 집합을 사용하는 경우 PyPI에서 정렬된 집합 구현을 사용하는 것을 고려해 보십시오.sorted containers 모듈은 이 목적으로만 SortedSet을 제공합니다.몇 가지 이점: 순수 Python, Fast-as-C 구현, 100% 유닛 테스트 적용 범위, 스트레스 테스트 시간.

PyPI에서 쉽게 설치할 수 있습니다.

pip install sortedcontainers

, 할 수 pip install오픈 소스 저장소에서 sortedlist.py 및 sortedset.py 파일을 풀다운하기만 하면 됩니다.

인스톨 하면, 다음의 조작을 간단하게 실시할 수 있습니다.

from sortedcontainers import SortedSet
help(SortedSet)

또한 sorted containers 모듈은 몇 가지 대체 구현과의 성능 비교도 유지합니다.

Python의 가방 데이터 타입에 대한 코멘트는 가방을 효율적으로 구현하기 위해 사용할 수 있는 Sorted List 데이터 타입도 있습니다.

다른 답변에서 언급했듯이 python 3.7+의 경우 dict는 정의에 따라 정렬됩니다.OrderedDict할 수 있다abc.collections.MutableSet ★★★★★★★★★★★★★★★★★」typing.MutableSet하여 값을합니다.

import itertools
import typing

T = typing.TypeVar("T")

class OrderedSet(typing.MutableSet[T]):
    """A set that preserves insertion order by internally using a dict."""

    def __init__(self, iterable: typing.Iterator[T]):
        self._d = dict.fromkeys(iterable)

    def add(self, x: T) -> None:
        self._d[x] = None

    def discard(self, x: T) -> None:
        self._d.pop(x, None)

    def __contains__(self, x: object) -> bool:
        return self._d.__contains__(x)

    def __len__(self) -> int:
        return self._d.__len__()

    def __iter__(self) -> typing.Iterator[T]:
        return self._d.__iter__()

    def __str__(self):
        return f"{{{', '.join(str(i) for i in self)}}}"

    def __repr__(self):
        return f"<OrderedSet {self}>"

그럼 그냥:

x = OrderedSet([1, 2, -1, "bar"])
x.add(0)
assert list(x) == [1, 2, -1, "bar", 0]

작은 도서관에 코드를 몇 가지 테스트와 함께 추가해서 누구나 쉽게 할 수 있도록 했어요.pip install바로 그거에요.

코드에 , 팬더 에는 팬더가 포함되어 있습니다.Index오브젝트는 이 기사에 나타나 있듯이 순서 있는 집합과 같이 동작합니다.

기사의 예:

indA = pd.Index([1, 3, 5, 7, 9])
indB = pd.Index([2, 3, 5, 7, 11])

indA & indB  # intersection
indA | indB  # union
indA - indB  # difference
indA ^ indB  # symmetric difference

은 조금 늦었지만 setlist의 일부로서collections-extended이 두 가지를 모두 완벽하게 구현합니다.Sequence그리고.Set

>>> from collections_extended import setlist
>>> sl = setlist('abracadabra')
>>> sl
setlist(('a', 'b', 'r', 'c', 'd'))
>>> sl[3]
'c'
>>> sl[-1]
'd'
>>> 'r' in sl  # testing for inclusion is fast
True
>>> sl.index('d')  # so is finding the index of an element
4
>>> sl.insert(1, 'd')  # inserting an element already in raises a ValueError
ValueError
>>> sl.index('d')
4

GitHub: https://github.com/mlenzen/collections-extended

문서: http://collections-extended.lenzm.net/en/latest/

PyPI: https://pypi.python.org/pypi/collections-extended

없습니다.OrderedSet공식 도서관에서요참고로 모든 데이터 구조의 완전한 치트 시트를 만듭니다.

DataStructure = {
    'Collections': {
        'Map': [
            ('dict', 'OrderDict', 'defaultdict'),
            ('chainmap', 'types.MappingProxyType')
        ],
        'Set': [('set', 'frozenset'), {'multiset': 'collection.Counter'}]
    },
    'Sequence': {
        'Basic': ['list', 'tuple', 'iterator']
    },
    'Algorithm': {
        'Priority': ['heapq', 'queue.PriorityQueue'],
        'Queue': ['queue.Queue', 'multiprocessing.Queue'],
        'Stack': ['collection.deque', 'queue.LifeQueue']
        },
    'text_sequence': ['str', 'byte', 'bytearray']
}

다른 사람들이 말했듯이OrderedDict는 기능면에서 순서부여된 집합의 슈퍼셋이지만 API와 상호작용하기 위한 집합이 필요하고 변경할 필요가 없는 경우OrderedDict.keys()실제 구현입니다.abc.collections.Set:

import random
from collections import OrderedDict, abc

a = list(range(0, 100))
random.shuffle(a)

# True
a == list(OrderedDict((i, 0) for i in a).keys())

# True
isinstance(OrderedDict().keys(), abc.Set)   

단, 불변성과 딕트처럼 셋트를 구축해야 하지만 단순하고 빌트인만 사용합니다.

ParallelRegration 패키지는 ActiveState 레시피에 기반한 옵션보다 메서드 완성도가 높은 setList() 순서 세트클래스를 제공합니다.목록에 사용할 수 있는 모든 메서드와 세트에 사용할 수 있는 모든 메서드를 지원합니다.

다음과 같은 기능을 하는 pip 라이브러리가 있습니다.

pip install ordered-set

그런 다음 사용할 수 있습니다.

from ordered_set import OrderedSet

많은 목적을 위해 분류된 전화를 하는 것만으로 충분합니다.예를들면

>>> s = set([0, 1, 2, 99, 4, 40, 3, 20, 24, 100, 60])
>>> sorted(s)
[0, 1, 2, 3, 4, 20, 24, 40, 60, 99, 100]

이 기능을 반복해서 사용할 경우 정렬된 함수를 호출하면 오버헤드가 발생하므로 세트 변경이 완료되면 결과 목록을 저장할 수 있습니다.고유한 요소 및 정렬을 유지해야 하는 경우 없음과 같은 임의의 값을 가진 컬렉션에서 Ordered Dict를 사용하는 제안에 동의합니다.

그래서 저는 독특한 가치를 도입할 수 있는 작은 목록도 가지고 있었습니다.

나는 어떤 종류의 독특한 리스트가 있는지 찾아봤지만, 그것을 추가하기 전에 그 요소의 존재를 테스트하는 것은 잘 된다는 것을 깨달았다.

if(not new_element in my_list):
    my_list.append(new_element)

이 간단한 접근법에 주의사항이 있을지는 모르겠지만 문제가 해결됩니다.

언급URL : https://stackoverflow.com/questions/1653970/does-python-have-an-ordered-set

반응형