पायथन में एक आदेशित शब्दकोश है । एक ऑर्डर किए गए सेट के बारे में क्या?
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)
मैं नहीं जानता कि क्या इस सरल दृष्टिकोण के लिए चेतावनी हैं, लेकिन यह मेरी समस्या को हल करता है।