Programing

파이썬에는 순서가 있습니까?

lottogame 2020. 2. 20. 23:11
반응형

파이썬에는 순서가 있습니까?


파이썬에는 사전이 있습니다. 주문 세트는 어떻습니까?


이것에 대한 순서화 된 세트 (가능한 새로운 링크 ) 레시피가 있으며, 이는 Python 2 Documentation 에서 참조됩니다 . Py2.6 이상 및 3.0 이상에서 수정없이 실행됩니다. 인터페이스는 초기화로 목록을 작성해야한다는 점을 제외하면 일반 세트와 거의 동일합니다.

OrderedSet([1, 2, 3])

이것은 MutableSet이므로에 대한 서명 .union이 세트 의 서명 과 일치하지 않지만 __or__비슷한 것을 포함하기 때문에 쉽게 추가 할 수 있습니다.

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

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

정렬 된 집합은 기능적으로 정렬 된 사전의 특수한 경우입니다.

사전의 키는 고유합니다. 따라서 정렬 된 사전에서 값을 무시하면 (예 : 값을 할당하여 None) 본질적으로 정렬 된 세트를 갖습니다.

파이썬 3.1으로 있다 collections.OrderedDict. 다음은 OrderedSet의 구현 예입니다. (단 몇 가지 방법을 정의 또는 오버라이드 (override) 할 필요가 있습니다 : collections.OrderedDictcollections.MutableSet. 무거운 리프팅을 할)

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__)

대답은 아니오이지만 동일한 목적 collections.OrderedDict으로 키 (및 값 None) 만으로 Python 표준 라이브러리에서 사용할 수 있습니다 .

업데이트 : Python 3.7 (및 CPython 3.6)부터 표준 dict순서를 유지하도록 보장되며 보다 성능이 뛰어납니다 OrderedDict. 그러나 이전 버전과의 호환성 및 특히 가독성을 위해 계속해서 사용하는 것이 OrderedDict좋습니다.

다음 dict은 순서를 유지하면서 중복 항목을 필터링하여 순서 집합을 에뮬레이트하는 순서 집합 으로 사용하는 방법의 예입니다 . 사용 dict클래스 메소드를 fromkeys()다음 단순히 요청하는 딕셔너리를 만드는 keys()다시.

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

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

나는 당신에게 OrderedSet보다 하나 더 잘 할 수 있습니다 : boltons는 순서가 지정된 세트 일뿐 만 아니라 색인을 지원 하는 순수한 파이썬, 2/3 호환 IndexedSet유형 을 가지고 있습니다 (목록과 마찬가지로).

간단하게 pip install boltons(또는 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 구현

다른 사람들은 파이썬 (아직)에 삽입 순서 보존 세트의 내장 구현이 없다고 지적했지만이 질문에는 PyPI 에서 무엇을 찾을 수 있는지에 대한 답변이 누락되었다고 생각합니다 .

내가 아는 한, 현재 다음과 같습니다.

두 구현 모두 Raymond Hettinger가 ActiveState에 게시 한 레시피를 기반으로하며 여기 다른 답변에서도 언급됩니다. 둘 다 체크 아웃하고 다음을 식별했습니다.

중요한 차이점 :

  • 주문 세트 (버전 1.1)
    • 장점 : 인덱스에 의해 조회를 위해 O (1) (예 my_set[5])
    • 단점 : remove(item)구현되지 않음
  • oset (버전 0.1.3)
    • 장점 : O (1) remove(item)
    • 단점 : 인덱스 별 조회의 경우 분명히 O (n)

모두 구현은 O (1)에 대한이 add(item)__contains__(item)( item in my_set)를.

불행히도 구현에는 set1.union(set2)-> 와 같은 메소드 기반 세트 작업이 없습니다 set1 | set2. 대신 연산자 기반 양식을 사용해야합니다 . set 연산 방법과 그에 따른 연산자 기반의 전체 목록은 Set Objects에 대한 Python 설명서를 참조하십시오 .

remove(item)스크립트를 처음으로 중단 한을 사용할 때까지 처음으로 ordered-set을 사용 했습니다 NotImplementedError. 지금까지 색인으로 조회를 사용한 적이 없으므로 oset으로 전환했습니다.

PyPI의 다른 구현에 대해 알고 있다면 의견을 보내주십시오.


정렬 된 순서를 유지하기 위해 정렬 된 집합을 사용하는 경우 PyPI에서 정렬 된 집합 구현을 사용해보십시오. sortedcontainers의 모듈은 제공 SortedSet의를 바로이 목적을 위해. 몇 가지 장점 : 순수 Python, 빠른 C 구현, 100 % 단위 테스트 범위, 스트레스 테스트 시간.

pip를 사용하면 PyPI에서 쉽게 설치할 수 있습니다

pip install sortedcontainers

할 수없는 경우 오픈 소스 리포지토리pip install 에서 sortedlist.py 및 sortedset.py 파일을 풀다운하면 됩니다.

설치 한 후에는 간단히 다음을 수행 할 수 있습니다.

from sortedcontainers import SortedSet
help(SortedSet)

sortedcontainers 모듈은 여러 대체 구현과 성능 비교유지합니다 .

Python의 bag 데이터 유형에 대한 질문 에는 bag을 효율적으로 구현하는 데 사용할 수 있는 SortedList 데이터 유형이 있습니다.


코드에서 이미 팬더를 사용중인 경우이 기사에Index 표시된 것처럼 해당 객체는 정렬 된 세트처럼 동작 합니다.


후반 게임에 조금씩, 그러나 나는 클래스를 작성했습니다 setlist의 일환으로 collections-extended이 완벽하게 구현 모두 SequenceSet

>>> 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']
}

ParallelRegression의 패키지는 제공 연주곡 ()를 더 메소드 완료 ActiveState의 조리법에 따라 옵션보다 세트 클래스를 명령했다. 리스트에 사용 가능한 모든 메소드를 지원하며, 세트에 사용 가능한 모든 메소드가 아닌 경우가 대부분입니다.


많은 목적을 위해 단순히 소트를 부르는 것으로 충분합니다. 예를 들어

>>> 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]

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


그래서 나는 또한 고유하지 않은 값을 도입 할 가능성이있는 작은 목록을 가지고있었습니다.

나는 일종의 고유 한 목록이 있는지 검색했지만 요소를 추가하기 전에 요소의 존재를 테스트하면 제대로 작동한다는 것을 깨달았습니다.

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

이 간단한 접근 방식에주의 사항이 있는지 모르겠지만 문제를 해결합니다.

참고 URL : https://stackoverflow.com/questions/1653970/does-python-have-an-order-set



반응형