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
'programing' 카테고리의 다른 글
리스트에서 아이템을 랜덤으로 선택하려면 어떻게 해야 하나요? (0) | 2022.12.09 |
---|---|
php 함수는 기본적으로 무엇을 반환합니까? (0) | 2022.12.09 |
이클립스에서의 라인 번호 카운트 (0) | 2022.12.09 |
Nuxt에서 다른 Vuex 상태에서 Vuex 상태에 액세스하는 방법 (0) | 2022.12.09 |
Meteor, Ember.js 및 Backbone.js의 주요 차이점은 무엇입니까? (0) | 2022.12.09 |