पायथन में एक आदेशित शब्दकोश है । एक ऑर्डर किए गए सेट के बारे में क्या?
collections.Counter
अजगर का बैग है।
पायथन में एक आदेशित शब्दकोश है । एक ऑर्डर किए गए सेट के बारे में क्या?
collections.Counter
अजगर का बैग है।
जवाबों:
इसके लिए एक ऑर्डर किया हुआ सेट (संभावित नया लिंक ) नुस्खा है जिसे पायथन 2 डॉक्यूमेंटेशन से संदर्भित किया गया है । यह 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
update
, union
, intersection
।
union
एक ही कक्षा में दो तरीकों से दोनों को बुलाए जाने की अनुमति नहीं है । अंतिम एक "जीत" होगा और पहले वाला रनटाइम में मौजूद नहीं रहेगा। ऐसा इसलिए है क्योंकि OrderedSet.union
(किसी भी परेंस को) किसी एक ऑब्जेक्ट को रेफर नहीं करना है ।
एक शब्दकोश की कुंजी अद्वितीय हैं। इस प्रकार, यदि कोई एक ऑर्डर किए गए शब्दकोश (जैसे उन्हें असाइन करके None
) में मानों की अवहेलना करता है , तो एक अनिवार्य रूप से एक आदेशित सेट है।
पायथन 3.1 के रूप में है collections.OrderedDict
। निम्नलिखित एक ऑर्डरेडसेट का एक उदाहरण कार्यान्वयन है। (ध्यान दें कि केवल कुछ तरीकों को परिभाषित करने या ओवरराइड करने की आवश्यकता है: collections.OrderedDict
और collections.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 = __sub__
difference_update = __isub__
intersection = __and__
intersection_update = __iand__
issubset = __le__
issuperset = __ge__
symmetric_difference = __xor__
symmetric_difference_update = __ixor__
union = __or__
OrderedSet
जो उपवर्गों OrderedDict
और abc.Set
और फिर परिभाषित __len__
, __iter__
और __contains__
।
collections
, लेकिन अन्यथा एक अच्छा सुझाव
OrderedSet([1,2,3])
एक प्रकार से बढ़ाता है। कंस्ट्रक्टर भी कैसे काम करता है? मिसिंग उपयोग उदाहरण।
इसका उत्तर नहीं है, लेकिन आप collections.OrderedDict
पायथन मानक पुस्तकालय None
से एक ही उद्देश्य के लिए सिर्फ चाबियाँ (और मान के रूप में ) का उपयोग कर सकते हैं ।
अपडेट : पायथन 3.7 (और सीपीथॉन 3.6) के रूप में, मानक dict
को ऑर्डर को संरक्षित करने की गारंटी है और की तुलना में अधिक प्रदर्शनकारी है OrderedDict
। (पिछड़ी अनुकूलता और विशेष रूप से पठनीयता के लिए, हालाँकि, आप का उपयोग जारी रखना चाह सकते हैं OrderedDict
।)
dict
आदेश का संरक्षण करते हुए डुप्लिकेट आइटम को फ़िल्टर करने के लिए एक सेट सेट के रूप में उपयोग करने का एक उदाहरण यहां दिया गया है, जिससे ऑर्डर किए गए सेट का अनुकरण किया जा सकता है। एक तानाशाह बनाने के लिए dict
कक्षा पद्धति fromkeys()
का उपयोग करें , फिर बस keys()
पीठ के लिए पूछें ।
>>> keywords = ['foo', 'bar', 'bar', 'foo', 'baz', 'foo']
>>> list(dict.fromkeys(keywords))
['foo', 'bar', 'baz']
dict.fromkeys()
। लेकिन उस मामले में, कुंजी ऑर्डर केवल CPython 3.6+ कार्यान्वयन में संरक्षित है, इसलिए OrderedDict
ऑर्डर के मामले में एक अधिक पोर्टेबल समाधान है।
keys = (1,2,3,1,2,1)
list(OrderedDict.fromkeys(keys).keys())
-> [1, 2, 3]
, अजगर -३.९। यह काम करता हैं।
dict
, set
पायथन में 3.7+ दुर्भाग्य से आदेश को संरक्षित नहीं करता है।
मैं आपको एक ऑर्डरेडसेट से बेहतर कर सकता हूं: बोल्ट में शुद्ध-पायथन, 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 पर क्या पाया जाना है ।
पैकेज हैं:
इनमें से कुछ कार्यान्वयन रेमंड हेटिंगर द्वारा ActiveState में पोस्ट की गई रेसिपी पर आधारित हैं जिसका उल्लेख यहाँ अन्य उत्तरों में भी किया गया है।
my_set[5]
)remove(item)
दोनों कार्यान्वयन हे (1) के लिए है add(item)
और __contains__(item)
( item in my_set
)।
set.union
पर काम नहीं करते हैं, भले ही यह विरासत में मिलता है collections.abc.Set
।
यदि आप क्रमबद्ध क्रम को बनाए रखने के लिए सेट किए गए सेट का उपयोग कर रहे हैं, तो PyPI से सॉर्ट किए गए सेट कार्यान्वयन का उपयोग करने पर विचार करें। Sortedcontainers मॉड्यूल एक प्रदान करता है SortedSet सिर्फ इस उद्देश्य के लिए। कुछ लाभ: शुद्ध-पायथन, तेज़-एस-सी कार्यान्वयन, 100% यूनिट परीक्षण कवरेज, तनाव परीक्षण के घंटे।
PyPI से स्थापित करना पाइप से आसान है:
pip install sortedcontainers
ध्यान दें कि यदि आप नहीं कर सकते pip install
, तो केवल ओपन-सोर्स रिपॉजिटरी से सॉर्टलिस्टलिस्ट और सॉर्टसेटसेट ओरेकल को नीचे खींचें ।
एक बार स्थापित करने के बाद आप बस:
from sortedcontainers import SortedSet
help(SortedSet)
Sortedcontainers मॉड्यूल भी एक बनाए रखता है कई वैकल्पिक कार्यान्वयन के साथ प्रदर्शन की तुलना है।
पायथन के बैग डेटा प्रकार के बारे में पूछने वाली टिप्पणी के लिए, वैकल्पिक रूप से एक SortedList डेटा प्रकार है, जो कुशलतापूर्वक एक बैग को लागू करने के लिए इस्तेमाल किया जा सकता है।
SortedSet
वहाँ के वर्ग को सदस्यों की तुलना करने योग्य और धोने योग्य बनाने की आवश्यकता है।
set
और frozenset
तत्वों को धोने योग्य होने की भी आवश्यकता होती है। तुलनीय बाधा के लिए जोड़ है SortedSet
, लेकिन यह भी एक स्पष्ट बाधा है।
यदि आप पहले से ही अपने कोड में पांडा का उपयोग कर रहे हैं, तो इसका 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
indA.difference(indB)
, ऋण चिह्न मानक घटाव करता है
खेल में थोड़ी देर हो गई है, लेकिन मैंने उस वर्ग 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
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 नुस्खा के आधार पर की तुलना में है कि आदेश दिया। यह सूचियों के लिए उपलब्ध सभी तरीकों का समर्थन करता है और सबसे अधिक अगर सेट के लिए उपलब्ध सभी तरीकों का नहीं।
जैसा कि अन्य जवाबों में बताया गया है कि अजगर 3.7+ के लिए, हुकुम को परिभाषा द्वारा आदेशित किया गया है। इसके बजाय उपवर्गीकरण की OrderedDict
हम उपवर्ग कर सकते हैं abc.collections.MutableSet
या typing.MutableSet
हमारे मूल्यों को स्टोर करने के dict की कुंजियों का उपयोग।
class OrderedSet(typing.MutableSet[T]):
"""A set that preserves insertion order by internally using a dict."""
def __init__(self, iterable: t.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)
def __contains__(self, x: object) -> bool:
return self._d.__contains__(x)
def __len__(self) -> int:
return self._d.__len__()
def __iter__(self) -> t.Iterator[T]:
return self._d.__iter__()
फिर बस:
x = OrderedSet([1, 2, -1, "bar"])
x.add(0)
assert list(x) == [1, 2, -1, "bar", 0]
मैंने इस कोड को एक छोटे से पुस्तकालय में रखा है , इसलिए कोई भी इसे बस कर सकता pip install
है।
कई उद्देश्यों के लिए बस सॉर्टिंग पर्याप्त होगी। उदाहरण के लिए
>>> 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]
यदि आप इसे बार-बार उपयोग करने जा रहे हैं, तो सॉर्ट किए गए फ़ंक्शन को कॉल करके ओवरहेड हो जाएगा, ताकि आप परिणामी सूची को सहेजना चाहें, जब तक कि आप सेट को बदलते रहें। यदि आपको अद्वितीय तत्वों को बनाए रखने और क्रमबद्ध करने की आवश्यकता है, तो मैं किसी भी तरह के मनमाने मूल्य के साथ संग्रह से ऑर्डरडेड का उपयोग करने के सुझाव से सहमत हूं।
इसलिए मेरे पास एक छोटी सूची भी थी जहां मुझे स्पष्ट रूप से गैर-अद्वितीय मूल्यों को पेश करने की संभावना थी।
मैंने किसी प्रकार की एक अनूठी सूची के अस्तित्व की खोज की, लेकिन फिर महसूस किया कि तत्व के अस्तित्व को जोड़ने से पहले परीक्षण करना ठीक काम करता है।
if(not new_element in my_list):
my_list.append(new_element)
मैं नहीं जानता कि क्या इस सरल दृष्टिकोण के लिए चेतावनी हैं, लेकिन यह मेरी समस्या को हल करता है।